% !TEX root = main.tex
我目前正在编写一个包含许多文件的大型文档。我在包含文件的开头使用该命令,如下例所示:
subfile1.tex
:
% !TEX root = main.tex
\section{Algebra}
(...)
subfile2.tex
:
% !TEX root = main.tex
\section{Analysis}
(...)
main.tex
:
\documentclass{book}
\begin{document}
\include{subfile1.tex}
\include{subfile2.tex}
\end{document}
在编辑这些文件时,subfile1.tex
我想仅编译的内容。subfile2.tex
我想知道是否有办法通过类似于的命令来告诉主文档仅编译调用文档% !TEX root = main.tex
。
理想情况下,我正在寻找如下命令
% !TEX \def\compileOnlyOneFile{YES}
% !TEX \def\nameFile{CURRENT_FILE}
TeXShop
PS:我在 macOS 上使用。
答案1
您可以写入一个文件作业名称重定向器.tex检查
- -command是否
\documentclass
已被使用,因此重新定义为等于宏\@twoclasseserror
和 - 是否
\begin{document}
已被处理,因此\AtBeginDocument
被重新定义为等于\@onlypreamble
并根据这些不同情况采取适当的行动。
通过\input
加载该文件作业名称重定向器.tex在你的序言中主文本并且位于子文件的开头。
如果命令位于“序言内部”,\@include
则可以对其进行修补,以确保在读取子 .aux 文件时,在加载 hyperref 的情况下,考虑到来自其他子文件的目的地需要重定向到主页.pdf它们存在的地方。
如果处于“序言之前”的状态,则\jobname
可以重定向,并且包含 URL 的真正底层机制主页.pdf可以定义来自其他子文件的交叉引用。
这样编译
- 主文本生成一个 .pdf 文件主页.pdf其中一切都是
\include
d,因此包含一切。你还可以得到主日志和主辅助和主目录和主文件和主地段ETC。 - 子文件1.tex生成一个 .pdf 文件子文件1.pdf包含所有内容主文本
\include
除 -command 之外的所有\include
-command子文件1.tex被忽略。此外,你还会得到子文件1.log和主辅助和主目录和主文件和主地段ETC。 - 子文件2.tex生成一个 .pdf 文件子文件2.pdf包含所有内容主文本
\include
除 -command 之外的所有\include
-command子文件2.tex被忽略。此外,你还会得到子文件2.log和主辅助和主目录和主文件和主地段ETC。
如果你想要实现从一个文件到另一个文件的交叉引用,主文本必须经过编译,因此所有文件都已包含,因此所有部分 .aux 文件子文件1.aux,子文件2.aux等等都被创建了。
如果加载了 hyperref 包,则由于交叉引用命令而创建的超链接将指向主页.pdf由于\include
当前编译的子文件以外的其他子文件而产生的,因此在当前编译产生的 .pdf 文件中不可用,这些文件被定向到主页.pdf, 假如说主页.pdf和所有子文件.pdf位于同一目录中。
如果不是这种情况,则在作业名称重定向器.tex查找该行\newcommand\URLofMainFile{./main.pdf}%
并更改该定义以使其适合您的.pdf 文件的目录结构。
\tableofcontents
由于书签和/或/ \listoffigures
/而产生的超链接\listoftables
不会被考虑。因此,在编译子文件时,您仍然可能很容易遇到类似以下的警告消息
pdfTeX warning (dest): name{section.1.2} has been refer
enced but does not exist, replaced by a fixed one
不提供任何担保。请自行承担风险。
主文本
\documentclass{book}
\usepackage{hyperref}
%======================================================================
% In case of loading hyperref do this _after_ loading hyperref:
\input jobnameredirector.tex
%======================================================================
\begin{document}
\chapter{A chapter in main document}
\section{Section in main document}\label{main}
References: \ref{main}/\ref{Algebra}/\ref{Analysis}
\include{subfile1.tex}
\include{subfile2.tex}
\end{document}
子文件1.tex
\input jobnameredirector.tex
%======================================================================
\section{Algebra}\label{Algebra}
References: \ref{main}/\ref{Algebra}/\ref{Analysis}
(...)
子文件2.tex
\input jobnameredirector.tex
%======================================================================
\section{Analysis}\label{Analysis}
References: \ref{main}/\ref{Algebra}/\ref{Analysis}
(...)
作业名称重定向器.tex
\edef\restoreat{\noexpand\catcode`\noexpand\@=\the\catcode`\@\relax}%
\makeatletter
\ifx\documentclass\@twoclasseserror
% Document-Preamble / \documentclass has already been processed.
\ifx\AtBeginDocument\@onlypreamble\else
% \begin{document} is not reached yet.
% \@ifpackageloaded{hyperref}\iftrue{\csname iffalse \endcsname}%
\RequirePackage{etoolbox}%
\providecommand\patchnewlabel[1]{}%
\providecommand\resetnewlabel{}%
\patchcmd{\@include}%
{\immediate\write\@mainaux{\string\@input{#1.aux}}}%
{%
\immediate\write\@mainaux{\string\patchnewlabel{#1}}%
\immediate\write\@mainaux{\string\@input{#1.aux}}%
\immediate\write\@mainaux{\string\resetnewlabel}%
}%
{\message{Success with patching \string\include!!!}}%
{\message{Problem patching \string\include!!!}}%
% \fi
\fi
\restoreat
\else
% Document-Preamble / \documentclass has not yet been processed:
\@ifdefinable\savedjobname{\edef\savedjobname{\jobname}}%
\def\jobname{main}%
\@onelevel@sanitize\jobname \global\let\jobname=\jobname
%=======================================================================
\newcommand\URLofMainFile{./main.pdf}%
\newcommand\patchnewlabel[1]{%
\let\Saved@newl@bel=\@newl@bel
\def\@newl@bel{\@newl@bel@addURL{#1}}%
}%
\newcommand\@newl@bel@addURL[4]{%
\ifnum\pdfstrcmp{#1}{\savedjobname}=0 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{\Saved@newl@bel{#2}{#3}{#4}}{\split@newl@bel@addURL#4{}{}{}\\{\Saved@newl@bel{#2}{#3}}}%
}%
\@ifdefinable\split@newl@bel@addURL{%
\long\def\split@newl@bel@addURL#1#2#3#4#5\\#6{%
\ifcat$\detokenize{#4}$\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#6{{#1}{#2}}}%
{%
\expandafter\Exchange\expandafter{\expandafter{%
\romannumeral
\expandafter\Exchange\expandafter{\expandafter{\URLofMainFile}}{0 {#1}{#2}{#3}{#4}}%
}}{#6}%
}%
}%
}%
\newcommand\Exchange[2]{#2#1}%
\newcommand\resetnewlabel{\let\@newl@bel=\Saved@newl@bel}%
\newcommand\Saved@newl@bel{}%
%=======================================================================
\restoreat
\includeonly{\savedjobname.tex}%
\Exchange{\input{\jobname.tex}}%
\fi
答案2
除了使用根注释之外,您还可以\include
通过以下方式创建子文件本身\includeonly
子文件1
\ifnum\pdfstrcmp{\jobname}{subfile1}=0
\AtBeginDocument{\includeonly{subfile1}}
\def\jobname{subfile1-main}
\def\tmp{\input{main}}
\expandafter\tmp
\fi
\section{Algebra}
(...)
子文件2
\ifnum\pdfstrcmp{\jobname}{subfile2}=0
\AtBeginDocument{\includeonly{subfile2}}
\def\jobname{subfile2-main}
\def\tmp{\input{main}}
\expandafter\tmp
\fi
\section{Analysis}
(...)
主要的
\documentclass{book}
\begin{document}
\include{subfile1.tex}
\include{subfile2.tex}
\end{document}