![涉及辅助文件的自定义 LaTeX 命令](https://linux22.com/image/256538/%E6%B6%89%E5%8F%8A%E8%BE%85%E5%8A%A9%E6%96%87%E4%BB%B6%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%20LaTeX%20%E5%91%BD%E4%BB%A4.png)
有 LaTeX 知识水平较低的人能帮我创建新的自定义命令吗?这些命令应命名为\storeitem
和\typesetitems
,其工作方式应如下:
\typesetitems
\storeitem{hello}
some other stuff
\typesetitems
\storeitem{world}
命令应该执行以下操作:
- 第一次运行 LaTeX 时,
\storeitem
命令应将其参数放入辅助文件中,在本例中为“hello”和“world”。 - 每次
\typesetitems
发生(假设发生的次数与\storeitem
命令的次数相同 - 在上例中为两次)应将所有存储的项目放在具有正常字体的常规项目符号列表 (itemize) 中,但第 N 次出现的\typesetitems
第 N 个项目应以斜体字体排版。
因此,上述命令的结果将是这样的:
如果可能的话,还应包括其他一些内容,以提高友好性和稳健性:
\storeitem
如果和出现的次数\typesetitems
不匹配,则发出警告。(并使用“溢出”命令(可以是其中任何一个)做一些优雅的事情。)如果编辑现有 s 的参数
\storeitem
、添加新\storeitem
s 或删除现有\storeitem
s,则会产生某种“标签已更改,请重新运行”警告消息。(类似于标签更改时 LaTeX 默认执行的操作。)也许以后我可能不需要 itemize。也许我想要编号列表。或者也许我根本不想要列表。也许我想对第 N 个项目执行其他操作,而不是将其斜体化。出于这些原因,编辑自定义命令以满足个人需求应该相当简单。
答案1
以下将文件中的引用(item1
、、、……)中的项目存储起来。最后一个数字记住在引用中。 设置环境中的项目,item2
从引用中获取存储的项目,直到。使用两个计数器,计算存储的项目和的数量。如果在文档末尾两个计数器不同,则发出警告。item3
.aux
itemlast
\typesetitems
itemize
item1
item<itemlast>
storeitem
typesetitems
\typesetitems
\documentclass{article}
\usepackage{atveryend}
\usepackage{zref-base}
\newcounter{storeitem}
\newcounter{typesetitems}
\makeatletter
\newcommand*{\storeitem}[1]{%
\@bsphack
\begingroup
\stepcounter{storeitem}%
\zref@setcurrent{default}{#1}%
\zref@wrapper@immediate{%
\zref@labelbyprops{item\the\value{storeitem}}{default}%
}%
\endgroup
\@esphack
}
\AfterLastShipout{%
\zref@wrapper@immediate{%
\zref@setcurrent{default}{\the\value{storeitem}}%
\zref@labelbyprops{itemlast}{default}%
}%
\ifnum\value{storeitem}=\value{typesetitems}%
\else
\@latex@warning@no@line{%
Mismatch store/typeset items:\MessageBreak
\string\storeitem: \the\value{storeitem}\MessageBreak
\string\typesetitems: \the\value{typesetitems}%
}%
\fi
}
\newcommand*{\typesetitems}{%
\stepcounter{typesetitems}%
\zref@refused{itemlast}%
\ifnum\zref@extractdefault{itemlast}{default}{0}>0 %
\begin{itemize}
\count@=0 %
\@whilenum\count@<\zref@extractdefault{itemlast}{default}{0}\relax
\do{%
\advance\count@ by\@ne
\item
\ifnum\value{typesetitems}=\count@
\expandafter\textit
\else
\expandafter\@firstofone
\fi
{\zref@extract{item\the\count@}{default}}%
\zref@refused{item\the\count@}%
}%
\end{itemize}%
\fi
}
\makeatother
\begin{document}
\typesetitems
\storeitem{hello}
some other stuff
\typesetitems
\storeitem{world}
\end{document}