问题

问题

假设我有以下内容

\newcommand\app[1]{\textbf{#1}} % <- #1 is appended's macro's parameter
\apptocmd{\app}{#1}{}{} % <- passing appended macro's parameter to appended macro again

\app{Food App}

\app将如下所示 ->\textbf{#1}#1

假设我想将每次出现的事件写入\app一个文件:

\newwrite\appfile
\AtBeginDocument{\immediate\openout\appfile=\jobname-app.txt}
\AtEndDocument{\immediate\closeout\appfile} 
\apptocmd{\app}{\immediate\write\appfile{#1}}{}{}

问题

现在,假设我想要巧妙地将应用程序的每个出现都写入一个文件,但只有在“调试”模式开启时才可以。

所以,我可以

  1. 用宏包围它
  2. 用条件语句包围它

对于选项 1,我不知道如何处理我的参数#1。我尝试使用\noexpand#1,但它不起作用。我需要将传递#1给原始\app宏。

\newcommand\debugmode{
  \newwrite\appfile
  \AtBeginDocument{\immediate\openout\appfile=\jobname-app.txt}
  \AtEndDocument{\immediate\closeout\appfile} 
  \apptocmd{\app}{\immediate\write\appfile{#1}}{}{}
}
\debugmode

选项 2,在解析时实时应用,这对于我的情况来说并不理想(这里没有显示我的情况):

  \newif\ifdebugmode
  \ifdebugmode %
  \newwrite\appfile
  \AtBeginDocument{\immediate\openout\appfile=\jobname-app.txt}
  \AtEndDocument{\immediate\closeout\appfile} 
  \apptocmd{\app}{\immediate\write\appfile{#1}}{}{}
  \fi

  \debugmodetrue

例子

参见代码中的备注。

\documentclass{article}
\usepackage{fontspec}% typeset with xelatex
\usepackage{etoolbox}

\newcommand\app[1]{\textbf{#1}}

\newcommand\debugmode{
  \newwrite\appfile
  \AtBeginDocument{\immediate\openout\appfile=\jobname-app.txt}
  \AtEndDocument{\immediate\closeout\appfile} 
  \apptocmd{\app}{\immediate\write\appfile{#1}}{}{} % <-- #1 not expanded correctly, because it is embedded. LaTeX expects ##1
}
\debugmode

\begin{document}
\app{Food App}
\app{Dictionary App}
\end{document}

顺便说一句,令我失望的是,我不得不改用 LaTeX2e,因为 LaTeX3 并不真正支持修补。 :( 我发现自己又回到了根源……TeX

答案1

\apptocmd#当涉及到另一个命令时不喜欢处于争论之中。

您可以使用条件来做到这一点:

\documentclass{article}
\usepackage{etoolbox}

\newcommand\app[1]{\textbf{#1}}

\newif\ifdebugmode
\debugmodetrue % comment for not applying the patches
\ifdebugmode
  \newwrite\appfile
  \AtBeginDocument{\immediate\openout\appfile=\jobname-app.txt} 
  \AtEndDocument{\immediate\closeout\appfile} 
  \apptocmd\app{\immediate\write\appfile{\unexpanded{\app{#1}}}}{}{} 
\fi

\begin{document}

\app{Food App}
\app{Dictionary App}

\end{document}

(我放弃了fontspec那些与应用程序不相关的内容)。

该文件的内容-app.txt将是

\app {Food App}
\app {Dictionary App}

或者,使用regexpatch

\documentclass{article}
\usepackage{regexpatch}

\newcommand\app[1]{\textbf{#1}}

\newcommand\debugmode{%
  \newwrite\appfile
  \AtBeginDocument{\immediate\openout\appfile=\jobname-app.txt}
  \AtEndDocument{\immediate\closeout\appfile}
  \xapptocmd\app{\immediate\write\appfile{\unexpanded{\app{##1}}}}{}{}
}
\debugmode

\begin{document}

\app{Food App}
\app{Dictionary App}

\end{document}

答案2

我不清楚所需的详细行为,但是......

这就是所期望的吗?

\documentclass{article}
\usepackage{xpatch}
\newcommand\app[1]{\textbf{#1}} % <- #1 is appended's macro's parameter
\def\addtoapp#1{%
  \apptocmd{\app}{#1}{}{} % <- passing appended macro's parameter to appended macro again
}
\begin{document}
\app{Food App}
\addtoapp{This is a test}

\app{Food App}
\end{document}

在此处输入图片描述

或这个??

\documentclass{article}
\usepackage{xpatch}
\newcommand\app[1]{\def\tmp{#1}\textbf{\tmp}} % <- #1 is appended's macro's parameter
\def\addtoapp#1{%
  \xpatchcmd{\app}{{\tmp}}{{#1}}{}{} % <- passing appended macro's parameter to appended macro again
}
\begin{document}
\app{Food App}
\addtoapp{This is a test}

\app{Food App}
\end{document}

在此处输入图片描述

相关内容