如何在辅助文件中复制宏的参数?

如何在辅助文件中复制宏的参数?

我已尝试使用精美包装来做到这一点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 BlaBli 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}

相关内容