![循环遍历 .txt 文件的各行以生成命名法](https://linux22.com/image/433030/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%20.txt%20%E6%96%87%E4%BB%B6%E7%9A%84%E5%90%84%E8%A1%8C%E4%BB%A5%E7%94%9F%E6%88%90%E5%91%BD%E5%90%8D%E6%B3%95.png)
我是宏领域的新手,但我需要定义一个命令,该命令获取 .txt 文件的内容并使用它来添加命名条目。我的 .txt 文件如下所示:
hPSCs: Human pluripotent stem cells
CMs: Cardiomyocytes
hPSC-CMs: hPSC-derived cardiomyocytes
我希望我的命令基本上执行以下操作:
\nomenclature{hPSCs}{Human pluripotent stem cells}
\nomenclature{CMs}{Cardiomyocytes}
\nomenclature{hPSC-CMs}{hPSC-derived cardiomyocytes}
对于 .txt 文件的所有行。换句话说,我想要:
- 打开 .txt 文件
- 读取 .txt 文件的每一行。然后:
- 将文本以分隔符(本例中为“:”)拆分为两部分。我们分别
1
称之为2
- 使用这两个部分来构建添加命名法条目。因此它将是
\nomenclature{1}{2}
- 将文本以分隔符(本例中为“:”)拆分为两部分。我们分别
用任何编程语言来做这件事都不费时间,但我真的不知道在 Latex 中从哪里开始。如果你能帮助我,我将不胜感激。
答案1
这是一个稍微简单一点的解决方案,使用基本的 TeX\read
命令。文件应该为nominal.txt
。
\documentclass{article}
\usepackage{nomencl}
\makenomenclature
% Check that we don't use existing commands
\newcommand*\mytextfile{}
\newread\mytextfile
\newcommand*\donomencl{}
\def\donomencl#1:#2\par{\nomenclature{#1}{#2}}
\newcommand*\lastreadline{\par}
\begin{document}
% \nomenclature{hPSCs}{Human pluripotent stem cells}
% \nomenclature{CMs}{Cardiomyocytes}
% \nomenclature{hPSC-CMs}{hPSC-derived cardiomyocytes}
\openin\mytextfile=nomencl.txt
\loop\unless\ifeof\mytextfile %
\read\mytextfile to \nomenline
\ifx\nomenline\lastreadline
\else \expandafter\donomencl \nomenline\par
\fi
\repeat
\closein\mytextfile
Some text
\printnomenclature
\end{document}
答案2
在这里,我重新定义\nomenclature
只是为了显示(反标记)正在调用的内容。但是,该方法读取文件,按行用:
分隔符进行解析,并\nomenclature
使用行的两个部分的数据构造调用。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{readarray}
%\usepackage{listofitems}% IS LOADED BY readarray
\begin{filecontents*}[overwrite]{nom.txt}
hPSCs: Human pluripotent stem cells
CMs: Cardiomyocytes
hPSC-CMs: hPSC-derived cardiomyocytes
\end{filecontents*}
\usepackage{nomencl}
\makenomenclature
\begin{document}
\readarraysepchar{\\}
\readdef{nom.txt}\nomdata
\setsepchar{\\/:}
\ignoreemptyitems
\readlist*\nomlist{\nomdata}
\def\tmp{}
\foreachitem\z\in\nomlist[]{%
\itemtomacro\nomlist[\zcnt,1]\theacr
\itemtomacro\nomlist[\zcnt,2]\thedescr
\def\tmp{\expandafter\nomenclature\expandafter{\theacr}}%
\expandafter\tmp\expandafter{\thedescr}%
}
Testing nomenclature
\printnomenclature
\end{document}