\input 的 \renewcommand 用于嵌入输入文件,而不嵌入所有源文件

\input 的 \renewcommand 用于嵌入输入文件,而不嵌入所有源文件

我想重新定义\input命令,以便它也将输入文件嵌入到生成的文件中pdf。到目前为止,我使用了这个问题中的代码(在文档上标记输入的开始位置以及文件名):

\documentclass{article}
\usepackage{embedfile}
\usepackage{pgfplots}
\usepackage{letltxmacro}

\makeatletter
\LetLtxMacro\latex@iinput\@iinput
\renewcommand{\@iinput}[1]{%
    \latex@iinput{#1}%
    \embedfile[desc=input file]{#1}%
}
\makeatother

\begin{document}
    \input{input-prova.tex}
    \begin{tikzpicture}
        \begin{axis}
            \addplot {x};
        \end{axis}
    \end{tikzpicture}
\end{document}

这有效,但它有一个问题:当我使用其他包时,我对包源代码中存在的命令的pgfplots重新定义\input也会影响到我最终嵌入的所有这些文件。\inputpdf

第二个问题是,当我尝试以这种方式向该命令添加参数时:

\makeatletter
\LetLtxMacro\latex@iinput\@iinput
\renewcommand{\@iinput}[2][input file]{%
    \latex@iinput{#2}%
    \embedfile[desc=#1]{#2}%
}
\makeatother

\begin{document}
    \input[file description]{input-prova.tex}
\end{docmuent}

我收到一个错误...

我知道这两个问题都可以通过定义我自己的命令来解决:

\newcommand{\myinput}[2][input file]{%
    \input{#2}%
    \embedfile[desc=#1]{#2}%
}

但我想知道是否有一种不改变命令名称的方法\input

答案1

您不想修改内部命令,而是想修改用户级别的命令。

\makeatletter
\let\latex@input\input
\newcommand\red@input[2][input file]{%
  \embedfile[desc={#1}]{#2}\latex@input{#2}%
}
\AtBeginDocument{\let\input\red@input}
\makeatother

这将确保只有\input后面的命令\begin{document}才会导致源的嵌入。但是,某些包可能会\input在运行时使用,并且这些文件也会被嵌入。直接使用内部命令的命令\@iinput不会导致嵌入。

另外,更改记录命令的语法并不是最好的方法,因此我会使用新命令:

\newcommand{\sourceinput}[2][input file]{%
  \embedfile[desc={#1}]{#2}\input{#2}%
}

并用于\sourceinput我真正想要嵌入的文件。

相关内容