我有几个文件,每个文件都包含一个练习,为了制作文档,我包含了一组这样的文件。其中一些文件需要特殊处理,因此我需要创建一个条件输入命令,在包含该文件之前先测试该文件第一行上的关键字。
有些文件以以下内容开头:
\begin{minipage}
另一个 :
something else
\item
我只想在文件不以 开头时在包含之前添加\begin{minipage}
答案1
这是一个概念证明,因为问题中缺少细节。\tarassinput
只有当第一行与第二个参数一致时,命令才会输入文件。
\begin{filecontents*}{typea.tex}
% type A
here latex stuff
\end{filecontents*}
\begin{filecontents*}{typeb.tex}
% type B
here latex stuff
\end{filecontents*}
\documentclass{article}
\makeatletter
\newread\tarass@read
\newcommand{\tarassinput}[2]{%
% #1 is the name of the file, #2 is the first line
\openin\tarass@read=#1\relax
\begingroup\catcode`\%=12
\edef\tarass@tempa{\@percentchar\space#2\space}%
\read\tarass@read to\tarass@tempb
\closein\tarass@read
\ifx\tarass@tempa\tarass@tempb
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\endgroup\input{#1}}%
{\endgroup}%
}
\makeatother
\begin{document}
Yes: \tarassinput{typea}{type A}
No: \tarassinput{typeb}{type A}
\end{document}
现在有了更多的信息,以下是可能性l3regex
:
\begin{filecontents*}{typea.tex}
here latex stuff
\end{filecontents*}
\begin{filecontents*}{typeb.tex}
\begin{minipage}{5cm}
here latex stuff
\end{minipage}
\end{filecontents*}
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\tarassinput}{m}
{
\tl_set_from_file:Nnn \l_tarass_input_tl { } { #1 }
% \A matches the start
% \c{begin} matches \begin
% \cB. matches any "group begin" token
% \cE. matches any "group end" token
\regex_match:nVF { \A \c{begin} \cB. minipage \cE. } \l_tarass_input_tl { \item }
\tl_use:N \l_tarass_input_tl
}
\cs_generate_variant:Nn \regex_match:nnF { nV }
\ExplSyntaxOff
\begin{document}
\begin{itemize}
\item Start
\tarassinput{typea}
\tarassinput{typeb}
\end{itemize}
\end{document}