涉及辅助文件的自定义 LaTeX 命令

涉及辅助文件的自定义 LaTeX 命令

有 LaTeX 知识水平较低的人能帮我创建新的自定义命令吗?这些命令应命名为\storeitem\typesetitems,其工作方式应如下:

\typesetitems
\storeitem{hello}

some other stuff

\typesetitems
\storeitem{world}

命令应该执行以下操作:

  1. 第一次运行 LaTeX 时,\storeitem命令应将其参数放入辅助文件中,在本例中为“hello”和“world”。
  2. 每次\typesetitems发生(假设发生的次数与\storeitem命令的次数相同 - 在上例中为两次)应将所有存储的项目放在具有正常字体的常规项目符号列表 (itemize) 中,但第 N 次出现的\typesetitems第 N 个项目应以斜体字体排版。

因此,上述命令的结果将是这样的:

项目

如果可能的话,还应包括其他一些内容,以提高友好性和稳健性:

  1. \storeitem如果和出现的次数\typesetitems不匹配,则发出警告。(并使用“溢出”命令(可以是其中任何一个)做一些优雅的事情。)

  2. 如果编辑现有 s 的参数\storeitem、添加新\storeitems 或删除现有\storeitems,则会产生某种“标签已更改,请重新运行”警告消息。(类似于标签更改时 LaTeX 默认执行的操作。)

  3. 也许以后我可能不需要 itemize。也许我想要编号列表。或者也许我根本不想要列表。也许我想对第 N 个项目执行其他操作,而不是将其斜体化。出于这些原因,编辑自定义命令以满足个人需求应该相当简单。

答案1

以下将文件中的引用(item1、、、……)中的项目存储起来。最后一个数字记住在引用中。 设置环境中的项目,item2从引用中获取存储的项目,直到。使用两个计数器,计算存储的项目和的数量。如果在文档末尾两个计数器不同,则发出警告。item3.auxitemlast\typesetitemsitemizeitem1item<itemlast>storeitemtypesetitems\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}

结果

相关内容