![如何在辅助文件中复制宏的参数?](https://linux22.com/image/241499/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%BE%85%E5%8A%A9%E6%96%87%E4%BB%B6%E4%B8%AD%E5%A4%8D%E5%88%B6%E5%AE%8F%E7%9A%84%E5%8F%82%E6%95%B0%EF%BC%9F.png)
我已尝试使用精美包装来做到这一点newfile
。
但是,以下代码无法编译:(
\documentclass{article}
\usepackage{newfile}
\newoutputstream{outstream}
\openoutputfile{out.aux}{outstream}
\newcommand{\test}[1]
{%
\begin{writeverbatim}{outstream}
#1
\end{writeverbatim}
#1
}
\begin{document}
\test{Does it work?}
\closeoutputstream{outstream}
\end{document}
附言:如果可能的话,我希望得到一个 LaTeX 友好的答案:)
编辑
我得到了不错的答案,但它们无法让我以令人满意的方式解决我的问题。所以,让我更准确地告诉你我想做什么。
想象一下我的乳胶文件是:
\documentclass{article}
\usepackage{my_macros}
\begin{document}
\Exercise{Bla Bla Bla}
\Solution{Bli Blu Bla}
\end{document}
我希望乳胶文件的编译像往常一样生成一个 .pdf 文件,但是也两个辅助文件Exo.aux和Solu.aux分别包含Bla Bla Bla
和Bli Blu Bla
!
谢谢 !
PS:如果可能的话,我希望得到一个 LaTeX 友好的答案 :) 我很想了解 TeX,但尽管我得到了一些答案有关创建高级宏的在线参考?,我仍然觉得 TeX 非常深奥。我正在寻找一本用户友好的手册!
答案1
不,您不能使用“verbatim”环境作为命令的参数。
您所能做的就是定义一个具有缩写名称的环境:
\newenvironment{test}
{\writeverbatim{outstream}}
{\endwriteverbatim}
进而
\begin{test}
Does it work?
\end{test}
\begin{test}
Yes
\end{test}
将在文件中写入两行。
如果你能满足于“伪正文”写作,那么
\newcommand{\testA}{\addtostream{outstream}{\unexpanded{#1}}}
可能就是您正在寻找的。
使用环境形式,例如
\begin{test}
\section{Test}
Text
\end{test}
将会写
\section{Test}
Text
在输出文件中,
\testA{\section{Test}
Text}
将会写
\section {Test} Text
命令形式将在每个控制序列(不是控制符号)后添加一个空格,并且不会考虑换行符。当然,命令形式的参数应该与括号保持平衡。此外,#
字符会加倍(这可以解决)。
这完全取决于您想使用输出文件做什么。
答案2
这并没有回答标题中的问题,但根据您对@egreg 的回答的评论:
在某种程度上,我正在寻找一组宏,它可以删除文件的前导码,然后将其拆分为多个文件(基本上,一个文件用于命令
\Exercise
,一个文件用于命令\Solution
),以便我可以自动将它们输入到我的 book.tex 中
你实际上只是想要一种方法来提取其中一个宏的内容,同时忽略另一个宏的内容。为此,我建议你使用包裹standalone
将原始文件直接包含在主文件中。但是,重新定义要忽略的宏。因此,例如,当您只需要环境的内容时,您可以临时\Exercise
重新定义宏:\Solution
\newcommand*{\inputExercise}[1]{%
\let\OldSolution\Solution% Save original definition
\renewcommand{\Solution}[1]{}% Set \Solution to ignore parameter
\par\input{#1}%
\let\Solution\OldSolution% Restore original definition
}%
然后如果你的 latex 文件包含:
\documentclass{article}
\usepackage{my_macros}
\begin{document}
\Exercise{Bla Bla Bla}
\Solution{Bli Blu Bla}
\Exercise{Bla Bla Bla}
\Solution{Bli Blu Bla}
\end{document}
\Exercises
您可以提取特定内容并获取and/or的列表\Solutions
。为了说明(和测试)目的,我分别提取了两者以生成:
\documentclass{article}
\usepackage{xcolor}
\usepackage{filecontents}
\usepackage{standalone}
%\usepackage{my_macros}% Since I do not have my_macros.sty
\newcommand*{\Exercise}[1]{\textcolor{blue}{#1}}%
\newcommand*{\Solution}[1]{\textcolor{red}{#1}}%
% Following is so that I can package this test into one file
\begin{filecontents}{LatexSubfile.tex}
\documentclass{article}
\usepackage{my_macros}
\begin{document}
\Exercise{Bla Bla Bla}
\Solution{Bli Blu Bla}
\Exercise{Bla Bla Bla}
\Solution{Bli Blu Bla}
\end{document}
\end{filecontents}
% When want exercise only, we ignore \Solution
\newcommand*{\inputExercise}[1]{%
\let\OldSolution\Solution% Save original definition
\renewcommand{\Solution}[1]{}% Set \Solution to ignore parameter
\par\input{#1}%
\let\Solution\OldSolution% Restore original definition
}%
% When want solution only, we ignore \Exercise
\newcommand*{\inputSolution}[1]{%
\let\OldExercise\Exercise% Save original definition
\renewcommand{\Exercise}[1]{}% Set \Exercise to ignore parameter
\par\input{#1}%
\let\Exercise\OldExercise% Restore original definition
}%
\begin{document}
Exercises:
\inputExercise{LatexSubfile.tex}
\bigskip
Solutions:
\inputSolution{LatexSubfile.tex}
\end{document}