\newcommand 和命令名称

\newcommand 和命令名称

我想自动生成类似的命令

\newcommand{\Air}{\gls{air}}
\newcommand{\Earth}{\gls{earth}}
...

glossaries与包一起使用,而不\newcommand对词汇表的每个条目使用。这可能吗?如何做?

换句话说,是否可以自动创建以下类型的命令,其中参数的形式\AbbrAbbruppercaseabbr

\newglossaryentry{abbr}{name=...}

答案1

假设您想打印词汇表条目字段\Abbr的大写内容,这是一种方法。nameabbr

我使用了 egreg 描述的技巧回答界定\Abbr

\documentclass{article}

\usepackage{glossaries}

\let\oldglossaryentry\newglossaryentry
\renewcommand{\newglossaryentry}[2]{%
\def\tempname##1##2\relax{%
  \uppercase{\expandafter\gdef\csname ##1}##2\endcsname{\MakeUppercase{\glsentrytext{##1##2}}}%
}%
\tempname#1\relax%
\oldglossaryentry{#1}{#2}}

\newglossaryentry{abbr}
{
  name={abbreviation},
  description={description of abbreviation},
}

\makeglossaries

\begin{document}

\Abbr

\printglossaries
\end{document} 

答案2

作为 Roelof 答案的延伸:

可以使用 LaTeX 辅助宏\@car\@cdr提取给定名称的第一个字母,例如:

\documentclass[12pt]{article}

\makeatletter
\providecommand*\newfloat@capitalize[2]{%
  \edef\newfloat@tempa{\gdef\noexpand#1{\@car#2\@nil}}%
  \uppercase\expandafter{\newfloat@tempa}%
  \edef\newfloat@tempa{%
    \noexpand\g@addto@macro\noexpand#1{\@cdr#2\@nil}}%
  \newfloat@tempa}
\newcommand*\mynewglos[2]{%
  \newglossaryentry{#1}{#2}%
  \@namedef{#1}{\gls{#1}}%
  \newfloat@capitalize\@tempa{#1}%
  \@namedef{\@tempa}{\Gls{#1}}%
}
\makeatother

\usepackage{glossaries}
\makeglossaries{}
\begin{document}
\mynewglos{electrolyte}{name=electrolyte,description={solution able to conduct electric current}}
\gls{electrolyte} or \electrolyte{} or \Gls{electrolyte} or \Electrolyte
\printglossaries
\end{document}

一些说明:

  • \@car及其\@cdr用法均记录在 LaTeX 源中。
  • \newfloat@capitalize取自我的newfloat包,并将第一个参数(=command)定义为第二个参数(=name),但第一个字母大写。(它是\providecommand这样定义的,因此在文档中使用newfloat包不会造成任何损害。或者,可以给该宏起一个新名字,或者将其集成到定义中,\mynewglos这样就不需要辅助宏了。)
  • 在这种情况下,(辅助)宏\@tempa将被全局定义。这是由于使用了 LaTeX 辅助宏,\g@addto@macro该宏没有\l@addto@macro可执行相同操作但在本地的配套宏。(但\l@addto@macro许多 LaTeX 包都提供该宏,例如 KOMA-Script 文档类。)作为替代方案,可以使用 eTeX 原语\unexpanded来执行相同的操作而无需辅助宏,请参阅 KOMA-Script 提供的定义\l@addto@macro作为示例。

答案3

从第一个字母必须大写的参数创建宏变得极其困难(或者我做错了什么)。归根结底是\uppercase不可扩展的。并且\uppercase{\csname #1\endcsname}会将整个单词大写...

我能想到的最简单的方法是将大写单词也作为参数。也就是说,您可以使用以下内容:

\documentclass[12pt]{article}
\def\mynewglos#1#2#3{%
  \newglossaryentry{#1}{#3}%
  \expandafter\def\csname #1\endcsname{\gls{#1}}%
  \expandafter\def\csname #2\endcsname{\Gls{#1}}%
}
\usepackage{glossaries}
\makeglossaries{}
\begin{document}
\mynewglos{electrolyte}{Electrolyte}{name=electrolyte,description={solution able to conduct electric current}}
\gls{electrolyte} or \electrolyte{} or \Gls{electrolyte} or \Electrolyte
\printglossaries
\end{document}

请注意,这定义\Abbr为大写版本,\Gls而不是常规版本。您只需在包含 的定义中更改它即可#2。如果不需要,您也可以通过删除包含 的定义来删除小写定义#1

\Abbr如果有人有一个好的方法来从宏中定义仅abbr作为参数传递的内容,我会非常希望看到它:)

相关内容