我想要一个命令,它可以创建一个未评估的 LaTeX/TeX 代码位(在环境结束时进行评估,但这不是必要的信息),该代码是使用评估命令创建的。
以下是根据我的工作尝试创建的一个工作示例:
\newcommand{\myNotes}{\protect\item apple}
\newcounter{noteCnt}
\newcommand{\TblMark}[1]{
\stepcounter{noteCnt}
\alph{noteCnt} %in this example, this is just printing a character at this location
\makeatletter
\g@addto@macro\myNotes{ \protect\item \alph{noteCnt} #1} %creating item list
\makeatother}
%elsewhere in the latex file...
Hello, I am feeling very \TblMark{frustrated} about my lack of \Tex \TblMark{knowledge}.
Here is a list:
\myNotes
问题是,当myNotes
展开时,noteCnt
项目列表中会使用 的当前值。我希望项目列表使用展开noteCnt
时的值。\TblMark
我的目的是创造类似的东西:
你好,我对于自己缺少 TeX b 感到非常难过。
以下是列表:
- 沮丧的
- 知识
相反,我得到类似这样的信息:
你好,我对于自己缺少 TeX b 感到非常难过。
以下是列表:
- b 沮丧
- 知识
答案1
首先说几点:
\makeatletter
@
在读取包含的代码之前需要首次,所以我不太相信你的代码能按原样工作(在我的测试中它不行 ;-)- 由于宏
\g@addto@macro
没有扩展其输入(如您所述),所以\protect\item
在这里没有用(并且可能会在其他地方产生麻烦)。 - 我修正了一些小错误。如果您还有其他问题,请随时提问。
- 我用执行相同操作但扩展标记列表的
\g@addto@macro
构造替换了您的构造(全局地将未扩展的标记添加到宏的末尾) 。\xdef\myNotes{\unexpanded\expandafter{\myNotes}...}
- 现在
\item
确实需要保护\noexpand
。 \unexpanded{#1}
确保文本参数中不会发生不必要的扩展。
以下是修改后的 MWE:
\documentclass[12pt]{article}
\newcommand{\myNotes}{\protect\item apple}
\newcounter{noteCnt}
\newcommand{\TblMark}[1]
{%
\stepcounter{noteCnt}%
\alph{noteCnt}%in this example, this is just printing a character at this location
\xdef\myNotes{%
\unexpanded\expandafter{\myNotes}% previous contents of \myNotes, expanded once
\noexpand\item % \item, unexpanded (one token)
\alph{noteCnt} % expansion of counter `noteCnt' with space afterwards
\unexpanded{#1}% argument #1, not expanded (several tokens)
}%
}
\begin{document}
%elsewhere in the latex file...
Hello, I am feeling very \TblMark{frustrated} about my lack of \TeX\ \TblMark{knowledge}.
Here is a list:
\begin{itemize}
\myNotes
\end{itemize}
\end{document}