如何列出所有词汇表条目的所有字段?

如何列出所有词汇表条目的所有字段?

有没有办法列出词汇表条目的所有字段?如果有,是否也可以自动为所有定义的条目执行此操作?

例如,类似“ \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、、字段) textsymbol如下所示(该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命令解释:

  1. 将包含条目定义(glossary_entries.tex=参数#1)的文件内容存储在\glsEntriesListString命令中(carrefull 加上要给出的结束行字符的参数#2)。
  2. 使用参数中给出的列表分隔符将条目拆分为“条目键”和“条目字段” #3(例如,传递的分隔符是“ \newglossaryentry||”,表示使用“ \newglossaryentry或者||)“ ”(空格)作为列表分隔符),并将结果放入列表中:\myglsentrylist这就是为什么需要换行的原因为了分离“条目键”和“条目字段”(参见上面的“先决条件”部分),因为这个换行符被\readlist命令解释为空格。
  3. 通过删除花括号对字段进行分组来提取字段(仅包含在\i的偶数元素中\myglsentrylist[\i],奇数元素仅包含单独的条目键,例如),并使用逗号“ ”列表分隔符制作列表,然后使用包给出的宏直接打印它们。compressor_motor\myfieldslist,\foreachitemlistofitems

限制和可能的改进:

  • 由于每个键后面都需要换行符\newglossaryentry且没有注释“ %”,因此不够强大(因为代码会检测每个键后面的空格,以便将键与键后列出的字段分开)。
  • tikz也许catchfile可以避免使用包裹。

奖金:

  • 与由另一个词汇表条目(如 MWE 中)定义的词汇表条目字段(如nametext、字段)一起使用(该条目由 条目定义)。symbolcompressor_motorcompressor
  • 与用户创建的新自定义字段一起使用。

结果:

在此处输入图片描述

相关内容