有没有办法列出词汇表条目的所有字段?如果有,是否也可以自动为所有定义的条目执行此操作?
例如,类似“ \printallglossaryfields
”命令列出所有条目和每个条目的所有字段(参见下面的 MWE 和预期结果),就像词汇表打印一样,但打印所有条目字段:
\documentclass{article}
\usepackage[style=tree]{glossaries-extra}
\usepackage{verbatim}
\newglossaryentry{subsytem}{name={Subssytems},description={\glspar},sort={1}}
\newglossaryentry{ejector}
{
name={Ejector},
text={ejector},
sort={Ejector},
description={Air Ejector},
parent=subsytem
}
\newglossaryentry{compressor_motor}
{
name={Compressor Motor},
sort={compressor motor},
text={compressor motor},
description={Motor of the compressor},
symbol={cpm},
parent=subsytem
}
\begin{document}
\verb!\printallglossaryfields: !
\end{document}
下面是使用“”命令的预期结果的示例\printallglossaryfields
(我不关心列表的确切文本格式,因为我将在之后使用它进行 txt 转换,请参阅下面的“我为什么要这样做?”部分...):
我为什么想要这个?
因为我通常通过另一个词汇表条目来定义词汇表条目字段(如name
、、字段) text
,symbol
如下所示(该compressor_motor
条目与该条目一起定义compressor
):
\newglossaryentry{compressor_motor}
{
name={\glsname{compressor} Motor},
sort={compressor motor},
text={\gls{compressor} motor},
description={Motor of the \glsname{compressor}},
symbol={\glssymbol{compressor}m},
parent=compressor
}
我希望能够将所有词汇表条目转换为 CSV 文件,以便与不使用 LaTeX 的人共享……目前,我的想法是首先获取给出的文本\glsname{compressor_motor}
(即“压缩机电机”),而不是字段的实际内容name
(即“ \glsname{compressor} Motor
”)。然后将其转换为文本文件(例如使用 Pandoc 或 htlatex),然后进行后处理(可能使用 bash)以获得 CSV……
总结
是否有可能存在类似“ \printallglossaryfields
”的命令:
- 列出所有条目(对于我来说,打印定义中出现的条目的键值非常重要
\newglossaryentry{...}
,例如compressor_motor
,带有下划线)和每个条目的所有字段(像词汇表打印一样,但打印所有条目字段); - 如果所有条目中没有相同的字段,则是灵活的;
- 能够处理用户创建的新输入字段;
答案1
这里给出这个答案是为了不让这个问题没有几乎“有效”的答案,如果有人(很有可能)碰到这个解决方案并希望(奇怪的是)使用它。
如果有人能提出更清洁/更好的解决方案那就太好了!
这里有一个用于打印所有条目字段的解决方案(不是真正优雅和强大)(MWE 下面的一些解释和讨论):
先决条件:
- 所有词汇表条目定义都必须存储在文本文件中(
.tex
、.bib
等)。- 换行符必须在每个之后都存在,
\newglossaryentry
没有注释“%
”。所以这是好的:
- 换行符必须在每个之后都存在,
\newglossaryentry{subsystem}
{% A new line is needed after each \newglossaryentry key !!!
name={Subssytems},description={},sort={1}}
但不是{subsystem}
这个(在第一个 之后和之前插入一个字符{
):
\newglossaryentry{subsystem}% A comment here
{% A new line is needed after each \newglossaryentry key !!!
name={Subssytems},description={},sort={1}}
或者不是{subsystem}
这样(在第一个 之后和之前没有插入换行符{
):
\newglossaryentry{subsystem}{% No newline here just after {subsystem}
{%
name={Subssytems},description={},sort={1}}
- 需要 3 个包:
listofitems
(提取输入字段,感谢Steven B. Segletes 回答),tikz
(有一个很好的 for 循环),catchfile
(提取包含条目定义的文本文件的内容,感谢给出答案)
梅威瑟:
\documentclass{article}
\usepackage{listofitems}
\usepackage{tikz}% To make a nice for loop
\usepackage{catchfile}% To read the glossary entries file
\usepackage[style=tree]{glossaries-extra}
\makenoidxglossaries
\input{glossary_entries} % Need to be placed after the begin document for a good behaviour of \readlist command
\catcode`_=12% For a good print of underscore without using verbatim
\newcommand{\printallglossaryfields}[3]{{%
% #1 = name of the text file containing all the glossary entries definitions
% #2 = \endlinechar used by \CatchFileEdef for readinf the text file
% #3 = separator list in order to extract entries key, e.g. separator "\newglossaryentry|| " for set separator "\newglossaryentry" or " " (space)
% Read the text (.tex or .bib...) file containing the glossary entries definition
\IfFileExists{#1}
{\CatchFileEdef{\glsEntriesListString}{#1}{#2}}
\glsEntriesListString% This call is needed to a good behaviour of \readlist
\ignoreemptyitems% Ingnore empty items from le list
\setsepchar{#3/,}% Define separator for nested list with first list separator "\newglossaryentry" or " " (space) and second list separator "," (comma)
\readlist\myglsentrylist{\glsEntriesListString}% Extract the list from glossary entries
\setsepchar{,}% Define separator for the list inside a glossary entry (in order to extract fields)
\foreach \i in {1,2,...,\myglsentrylistlen}{%Loop under the glossary entry list
\ifodd\i% If odd, print the list element
\myglsentrylist[\i]\newline
\else% If even, make another list with the fields after removing curly braces "{}" surronding the fields
\itemtomacro\myglsentrylist[\i]\myfieldslisttemp
\expandafter\def\expandafter\myfieldslisttemp\myfieldslisttemp% Removing curly braces "{}"
\readlist\myfieldslist{\myfieldslisttemp}
{%
\foreachitem\x\in\myfieldslist[]{\ifnum\xcnt=1 \else\ \fi \indent\x\newline}% Print all list item (i.e. gls entry fields)
}%
\fi
}}}
\begin{document}
\glsaddall
\noindent
\printallglossaryfields{glossary_entries.tex}{\endlinechar=13}{\newglossaryentry|| }
\printnoidxglossaries
\end{document}
文件内容glossary_entries.tex
:
\newglossaryentry{subsystem}
{% A new line is needed after each \newglossaryentry key !!!
name={Subssytems},description={},sort={1}}
\newglossaryentry{compressor}
{% A new line is needed after each \newglossaryentry key !!!
name={Compressor},
sort={compressor},
text={compressor},
description={Compressor},
symbol={Cp},
parent=subsystem
}
\newglossaryentry{compressor_motor}
{% A new line is needed after each \newglossaryentry key !!!
name={\glsname{compressor} Motor},
text={\gls{compressor} motor},
description={Motor of the \gls{compressor}},
symbol={\glssymbol{compressor}m},
parent=compressor
}
\newglossaryentry{ejector}
{% A new line is needed after each \newglossaryentry key !!!
name={Ejector},
text={Ejector},
description={Air Ejector},
symbol={ej},
parent=subsystem
}
\printallglossaryfields
命令解释:
- 将包含条目定义(
glossary_entries.tex
=参数#1
)的文件内容存储在\glsEntriesListString
命令中(carrefull 加上要给出的结束行字符的参数#2
)。 - 使用参数中给出的列表分隔符将条目拆分为“条目键”和“条目字段”
#3
(例如,传递的分隔符是“\newglossaryentry||
”,表示使用“\newglossaryentry
”或者(||
)“”(空格)作为列表分隔符),并将结果放入列表中:
\myglsentrylist
。这就是为什么需要换行的原因为了分离“条目键”和“条目字段”(参见上面的“先决条件”部分),因为这个换行符被\readlist
命令解释为空格。 - 通过删除花括号对字段进行分组来提取字段(仅包含在
\i
的偶数元素中\myglsentrylist[\i]
,奇数元素仅包含单独的条目键,例如),并使用逗号“ ”列表分隔符制作列表,然后使用包给出的宏直接打印它们。compressor_motor
\myfieldslist
,
\foreachitem
listofitems
限制和可能的改进:
- 由于每个键后面都需要换行符
\newglossaryentry
且没有注释“%
”,因此不够强大(因为代码会检测每个键后面的空格,以便将键与键后列出的字段分开)。 tikz
也许catchfile
可以避免使用包裹。
奖金:
- 与由另一个词汇表条目(如 MWE 中)定义的词汇表条目字段(如
name
、text
、字段)一起使用(该条目由 条目定义)。symbol
compressor_motor
compressor
- 与用户创建的新自定义字段一起使用。
结果: