我的词汇表里全是数学和技术,有参数、指标等。一个类似的案例在1。
然而,由于我的索引的数量和类型因术语而异,我希望有多个参数\glsargA
,,\glsargB
..可以从中获取\glsinsert
并为每个条目专门定义默认值gls
。
我尝试合并来自2,但由于我不了解 TeX 的机制,所以我没有运气。
非工作示例:
\documentclass{scrreprt}
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{Upara}{
name=\ensuremath{u_{\glsargA}^{\glsargB}},
defaultargA=one,
defaultargB=two,
description={u}
}
\newglossaryentry{Xpara}{
name=\ensuremath{x_{\glsargB}^{\glsargA}},
defaultargA=I,
defaultargB=II,
description={x}
}
% magic might go here...
\defglsentryfmt{%
...
}
\begin{document}
$\gls{Upara}$
$\gls{Xpara}$
$\gls{Upara}[{aha}{b}]$
$\gls{Xpara}[{aha}{b}]$
$\gls{Upara}$
$\gls{Xpara}$
\printglossaries
\end{document}
答案1
这是尼古拉·塔尔博特的代码。
选项1
这使用了更接近所要求的语法,但不能满足您的所有要求。但是,它确实可以满足您的部分要求。它允许您分别为一位和两位条目设置“填充”占位符。虽然我为一位使用了 ,i
为两位使用了 ,i
但如果您愿意,也可以为前者使用 ,为后者使用 。但是,您不能针对每个条目指定这些。ii
i
kangaroos
elephants
所需的语法是\gls{<entry>}[<single argument>]
或\gls{<entry>}[<first argument>,<second argument>]
。
\documentclass{scrreprt}
\usepackage{glossaries}
\makeglossaries
\glsnoexpandfields
\newcommand*{\glsarg}{i}
\newcommand*\glsargA{i}
\newcommand*\glsargB{ii}
\newglossaryentry{BetragVektor}{
name=\ensuremath{|\overline{u_i}|},
text=|\overline{u_\glsarg}|,
description={}}
\newglossaryentry{Upara}{
name=\ensuremath{u_{i}^{ii}},
text=\ensuremath{u_{\glsargA}^{\glsargB}},
description={u}
}
\newglossaryentry{Xpara}{
name=\ensuremath{x_{ii}^{i}},
text=\ensuremath{x_{\glsargB}^{\glsargA}},
description={x}
}
% modify the entry's format
\makeatletter
\def\before@comma#1,#2\@nil{#1}
\def\after@comma#1,#2\@nil{#2}
\defglsentryfmt{% based on Nicola Talbot's code at https://tex.stackexchange.com/a/229879/
\let\orgglsargA\glsargA
\let\orgglsargB\glsargB
\let\orgglsarg\glsarg
\ifdefempty\glsinsert
{}%
{%
\edef\tempa{\expandafter\before@comma\glsinsert,\@nil}%
\edef\tempb{\glsinsert}%
\ifx\tempa\tempb
\let\glsarg\glsinsert
\else
\def\glsargA{\expandafter\before@comma\tempb\@nil}%
\def\glsargB{\expandafter\after@comma\tempb\@nil}%
\fi
\let\glsinsert\relax
}%
\glsgenentryfmt
\let\glsargA\orgglsargA
\let\glsargB\orgglsargB
\let\glsarg\orgglsarg
}
\makeatother
\begin{document}
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}$
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}[2]$
$\gls{BetragVektor}[]$
$\gls{Upara}$
$\gls{Xpara}$
$\gls{Upara}[aha,b]$
$\gls{Xpara}[aha,b]$
$\gls{Upara}$
\printglossaries
\end{document}
选项 2
通过定义新命令,这与请求的语法相差甚远\mygls{}[]
。语法与上面的解决方案相同,但新命令的优点是,您可以为不同的两位或不同的一位条目获取不同的默认值。
该解决方案使用包xparse
来更流畅地处理可选参数。
\documentclass{scrreprt}
\usepackage{glossaries,xparse}
\makeglossaries
\glsnoexpandfields
\newcommand*{\glsarg}{i}
\newcommand*\glsargA{i}
\newcommand*\glsargB{ii}
\newglossaryentry{BetragVektor}{
name=\ensuremath{|\overline{u_i}|},
text=|\overline{u_\glsarg}|,
description={}}
\newglossaryentry{Upara}{
name=\ensuremath{u_{one}^{two}},
text=\ensuremath{u_{\glsargA}^{\glsargB}},
description={u}
}
\newglossaryentry{Xpara}{
name=\ensuremath{x_{II}^{I}},
text=\ensuremath{x_{\glsargB}^{\glsargA}},
description={x}
}
% modify the entry's format
\makeatletter
\def\before@comma#1,#2\@nil{#1}
\def\after@comma#1,#2\@nil{#2}
\defglsentryfmt{% based on Nicola Talbot's code at https://tex.stackexchange.com/a/229879/
\let\orgglsargA\glsargA
\let\orgglsargB\glsargB
\let\orgglsarg\glsarg
\ifdefempty\glsinsert
{}%
{%
\edef\tempa{\expandafter\before@comma\glsinsert,\@nil}%
\edef\tempb{\glsinsert}%
\ifx\tempa\tempb
\let\glsarg\glsinsert
\else
\def\glsargA{\expandafter\before@comma\tempb\@nil}%
\def\glsargB{\expandafter\after@comma\tempb\@nil}%
\fi
\let\glsinsert\relax
}%
\glsgenentryfmt
\let\glsargA\orgglsargA
\let\glsargB\orgglsargB
\let\glsarg\orgglsarg
}
\NewDocumentCommand\mygls { m o }{%
\IfNoValueTF {#2}{%
\glossentryname{#1}%
}{%
\gls{#1}[#2]%
}%
}
\makeatother
\begin{document}
$\mygls{BetragVektor}[1]$
$\mygls{BetragVektor}$
$\mygls{BetragVektor}[1]$
$\mygls{BetragVektor}[2]$
$\mygls{BetragVektor}[]$
$\mygls{Upara}$
$\mygls{Xpara}$
$\mygls{Upara}[aha,b]$
$\mygls{Xpara}[aha,b]$
$\mygls{Upara}$
\printglossaries
\end{document}