怎样让术语命令和glossaries-extra宏包联动

Viewed 173

我自定义了译名\yiming和术语\newterm命令,用于处理术语翻译,可以正常工作。现在想进一步与glossaries-extra宏包联动,自动收集并打印术语表。请问要怎样设置?如果有必要修改译名\yiming和术语\newterm命令,也请帮助修改一下。mwe如下。感谢!

\documentclass{ctexbook}
\usepackage{babel} % 多语言支持宏包
\usepackage{fontspec} % 字体设置宏包
\usepackage{xcolor}


% 译名命令
\NewDocumentCommand{\yiming}{s m o}
{%
    \IfBooleanTF{#1}
    {% 有星号模式:正常显示
        \IfNoValueTF{#3}
        {{#2}}% % 仅显示原文
        {{#3}}% % 仅显示中文
    }
    {% 无星号模式:彩色注释显示
        \IfNoValueTF{#3}
        {% 无中文译名
            {\footnotesize\textcolor{blue}{\textbf{#2}}}\normalsize% % 蓝色原文
        }
        {% 有中文译名
            {\kaishu #3}{\scriptsize\textcolor{blue}{\textbf{(#2)}}}% % 中文+蓝色原文注释
        }%
    }%
}

% 术语创建命令:快速定义新术语
\NewDocumentCommand{\newterm}{m m m}{%
    \NewDocumentCommand{#1}{s m}{% 
        \IfBooleanTF{##1}{\yiming*{#2}[#3]}% % 有星号模式
        {\textcolor{blue}{\yiming*{#2}[#3]}}% % 无星号模式
    }%
}

% 加载术语译名
%\input{text/term} % 术语译名文件
\newterm{\myterm}{术语原文}{术语译名}

\title{术语mwe}
\author{Your Name}
\date{\today}

\begin{document}

\maketitle

\section{术语译名}

这是我的自定义术语命令\myterm{}

\end{document}
1 Answers

完美联动版!代码如下:

\documentclass{ctexart}
\usepackage{babel}
\usepackage{fontspec}
\usepackage{xcolor}
\usepackage[abbreviations, record=only]{glossaries-extra}

% 存储术语信息的宏
\newcommand{\storeterm}[3]{%
  \expandafter\def\csname term@#1\endcsname{#2}%
  \expandafter\def\csname term@#1@expl\endcsname{#3}%
}

% 获取术语信息的宏
\newcommand{\getterm}[1]{%
  \ifcsname term@#1\endcsname
    \csname term@#1\endcsname
  \else
    \empty% 如果没有找到,返回空
  \fi
}
\newcommand{\gettermexpl}[1]{%
  \ifcsname term@#1@expl\endcsname
    \csname term@#1@expl\endcsname
  \else
    % 如果没有阐释,返回空
  \fi
}

% 检查术语是否存在的宏
\newcommand{\iftermexists}[3]{%
  \ifcsname term@#1\endcsname
    #2% 存在时执行
  \else
    #3% 不存在时执行
  \fi
}

% 译名命令
\NewDocumentCommand{\yiming}{s m o}{%
  \IfBooleanTF{#1}
    {% 有星号模式:正常显示
      \IfNoValueTF{#3}
        {% 无可选参数
          \iftermexists{#2}
            {\getterm{#2}}% 术语存在:显示中文译名
            {#2}% 术语不存在:显示原文
        }
        {#3}% 有可选参数:显示提供的可选参数
    }
    {% 无星号模式:彩色注释显示
      \IfNoValueTF{#3}
        {% 无可选参数
          \iftermexists{#2}
            {% 术语存在:显示中文译名+蓝色原文注释
              {\kaishu \getterm{#2}}{\scriptsize\textcolor{blue}{\textbf{(#2)}}}%
            }
            {% 术语不存在:仅显示蓝色原文
              {\small\textcolor{blue}{\textbf{#2}}}\normalsize%
            }%
        }
        {% 有可选参数:显示提供的可选参数+蓝色原文注释
          {\kaishu #3}{\scriptsize\textcolor{blue}{\textbf{(#2)}}}%
        }%
    }%
}

% 术语命令
\NewDocumentCommand{\newterm}{m m m o}{%
  % 存储术语信息
  \IfNoValueTF{#4}
    {\storeterm{#2}{#3}{}}% 无阐释
    {\storeterm{#2}{#3}{#4}}% 有阐释

  % 定义命令
  \NewDocumentCommand{#1}{s g}{%
    \IfBooleanTF{##1}% 检查是否有星号
      {\textcolor{blue}{#3}}% 有星号:蓝色显示
      {#3}% 无星号:正常显示
  }%
  
  % 创建术语表条目
  \IfNoValueTF{#4}
    {\expandafter\newglossaryentry\expandafter{term@\detokenize{#1}}{%
        name={#3}, 
        description={\unexpanded{\textcolor{gray}{\scriptsize\textbf{原文:}}#2}}, 
        text={#3}
      }
    }
    {\expandafter\newglossaryentry\expandafter{term@\detokenize{#1}}{%
        name={#3}, 
        description={\unexpanded{\textcolor{gray}{\scriptsize\textbf{原文:}}#2\quad\textcolor{gray}{\scriptsize\textbf{阐释:}}#4}}, 
        text={#3}
      }
    }
  \glsadd{term@\detokenize{#1}}
}

\renewcommand{\glsnamefont}[1]{\textbf{#1}}

% =============================================================================
% 语言学术语定义
% =============================================================================

% 语音学术语
\newterm{\phonetics}{Phonetics}{语音学}[研究语音产生、传播和感知的学科]
\newterm{\phonology}{Phonology}{音系学}[研究语音系统和模式的学科]
\newterm{\ipa}{International Phonetic Alphabet}{国际音标}[标注语音的标准化符号系统]

% 语法学术语
\newterm{\syntax}{Syntax}{句法学}[研究句子结构的学科]
\newterm{\morphology}{Morphology}{形态学}[研究词汇结构和构成的学科]
\newterm{\grammar}{Grammar}{语法}[语言的结构规则体系]

% 语义学术语
\newterm{\semantics}{Semantics}{语义学}[研究语言意义的学科]
\newterm{\pragmatics}{Pragmatics}{语用学}[研究语言在语境中使用的学科]

% 历史语言学术语
\newterm{\etymology}{Etymology}{词源学}[研究词汇起源和历史的学科]
\newterm{\comparative}{Comparative Linguistics}{比较语言学}[通过比较研究语言关系的学科]

% 社会语言学术语
\newterm{\sociolinguistics}{Sociolinguistics}{社会语言学}[研究语言与社会关系的学科]
\newterm{\dialect}{Dialect}{方言}[特定地区或社会群体的语言变体]

% 应用语言学术语
\newterm{\applied}{Applied Linguistics}{应用语言学}[将语言学理论应用于实际问题的学科]
\newterm{\translation}{Translation Studies}{翻译学}[研究翻译理论和实践的学科]

% 文档信息
\title{语言学术语表与多语言支持}
\author{语言学研究者}
\date{\today}

\begin{document}

\maketitle

\section{语言学导论}
\yiming{Phonetics}和\yiming*{Phonology}是语言学的重要分支,前者研究语音的物理属性,后者研究语音在特定语言中的系统组织。使用\yiming*{International Phonetic Alphabet}可以精确记录任何语言的发音。

在语法研究方面,\yiming*{Syntax}[随便写什么]关注句子结构,而\yiming{Morphology}[随便写]研究词汇的内部结构。整个语言的\yiming*{Grammar}体系包含了形态、句法等多个层面。

\yiming*{Semantics}探讨语言的意义,而\yiming*{Pragmatics}则研究语言在具体语境中的使用和理解。

\section{历史与比较语言学}
\yiming*{Etymology}通过追溯词汇的历史演变来理解语言的发展。\yiming*{Comparative Linguistics}则通过比较不同语言的相似性来建立语言间的谱系关系。

\section{社会与应用语言学}
\yiming*{Sociolinguistics}研究语言与社会因素的关系,包括\yiming*{Dialect}的形成和使用。\yiming*{Applied Linguistics}将语言学理论应用于语言教学、\yiming*{Translation Studies}等实际领域。

\section{测试未定义的术语}
这是一个未定义的术语:\yiming{UndefinedTerm},它应该以蓝色显示。
这是另一个未定义的术语:\yiming{AnotherUndefinedTerm},也应该以蓝色显示。

有星号的未定义术语:\yiming*{UndefinedTermStar},应该正常显示。

\section{译名命令对比}
\yiming{Syntax}[随便写什么]

\yiming*{Syntax}[随便写什么]

\yiming{Syntax}

\yiming*{Syntax}

\syntax*{随便写什么}

\syntax{随便写什么}

% =============================================================================
% 生成术语表
% =============================================================================
\section{术语表}
\printunsrtglossary[title=语言学术语表, toctitle=术语表]

\end{document}