假设我有以下内容
\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,我不知道如何处理我的参数#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}