以下是根据我的工作尝试创建的一个工作示例:

以下是根据我的工作尝试创建的一个工作示例:

我想要一个命令,它可以创建一个未评估的 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

首先说几点:

  1. \makeatletter@在读取包含的代码之前需要首次,所以我不太相信你的代码能按原样工作(在我的测试中它不行 ;-)
  2. 由于宏\g@addto@macro没有扩展其输入(如您所述),所以\protect\item在这里没有用(并且可能会在其他地方产生麻烦)。
  3. 我修正了一些小错误。如果您还有其他问题,请随时提问。
  4. 我用执行相同操作但扩展标记列表的\g@addto@macro构造替换了您的构造(全局地将未扩展的标记添加到宏的末尾) 。\xdef\myNotes{\unexpanded\expandafter{\myNotes}...}
  5. 现在\item确实需要保护\noexpand
  6. \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}

结果

相关内容