我想自动生成类似的命令
\newcommand{\Air}{\gls{air}}
\newcommand{\Earth}{\gls{earth}}
...
glossaries
与包一起使用,而不\newcommand
对词汇表的每个条目使用。这可能吗?如何做?
换句话说,是否可以自动创建以下类型的命令,其中参数的形式\Abbr
为Abbr
uppercase
abbr
\newglossaryentry{abbr}{name=...}
答案1
假设您想打印词汇表条目字段\Abbr
的大写内容,这是一种方法。name
abbr
我使用了 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
作为参数传递的内容,我会非常希望看到它:)