\renewcommand 仅在具有子文件包的从属文件中

\renewcommand 仅在具有子文件包的从属文件中

有没有办法仅当子文件使用-package 编译时才更新命令subfiles

main.tex

\documentclass{article}
\usepackage{subfiles}
\newcommand{\foo}{foo}

\begin{document}
  \foo % always returns foo
  \subfile{content}
\end{document}

content.tex

\documentclass[main.tex]{subfiles}
\renewcommand{\foo}{bar}

\begin{document}
  Here is some content.
  \foo % always returns bar
\end{document}

当我编译从内部调用的函数main.tex时,返回 bar。我希望它在编译时返回 foo ,在编译时返回 bar 。这可能吗?\foocontent.texmain.texcontent.tex

的文档subfiles第 2.2 节指出:

• 如果从属文件被\subfile'd,它将忽略 和 之前的所有内容,包括\begin{document},并且 也会被忽略\end{document}。(文件主体,而不是其他内容,实际上是\input。)

但事实似乎并非如此。

答案1

这使用了类的内部特性subfiles(请参阅文档)

类定义\old@document@subfiles。如果存在,则运行的是类,否则仅运行包。使用 检查定义etoolbox \ifdef{}然后相应地定义命令非常容易。

在此处输入图片描述

(屏幕截图取自文档 subfiles.pdf)

\documentclass{article}
\usepackage{etoolbox}%
\usepackage{subfiles}%


\makeatletter
\ifdef{\old@document@subfiles}{%
  \newcommand{\foo}{bar}%
}{%
 \newcommand{\foo}{foo}%
}%
\makeatother


\begin{document}
  \foo % always returns foo
  \subfile{content}
\end{document}

答案2

一个草图,假设您知道是否subfiles使用,并且您用 标记它\subfilestrue

\documentclass{article}

\begin{document}
\newif\ifsubfiles

\newcommand{\foo}{FOO}

\foo
\renewcommand{\foo}{\ifsubfiles BAR\else FOO\fi}

A \foo

\subfilestrue

B \foo

\end{document}

答案3

\ifx\@onlypreamble\@notprerr#1\else#2\fi您可以按照以下建议检查自己是在序言中还是在实际文本中这个答案. 根据您的情况进行调整:

主文本

\documentclass{article}
\usepackage{subfiles}
\makeatletter
\newcommand{\insubfile}[1]{\ifx\@onlypreamble\@notprerr\else#1\fi}
\makeatother
\newcommand{\foo}{foo}

\begin{document}
\foo % always returns foo
\subfile{content}
\end{document}

内容.tex

\documentclass[main.tex]{subfiles}
\insubfile{\renewcommand{\foo}{bar}}

\begin{document}
  Here is some content.
  \foo % always returns bar
\end{document}

这给出了所需的结果,并且不依赖于subfiles包的内部宏。

相关内容