我正在尝试使用独立包。这个想法是拥有一个大型的独立 TeX 文件集合,每个文件包含一个“问题”(所有文本),并且能够编译更大的文档,每个文档包含从池中选择的几个问题。现在,我还想切换每个问题的“解决方案”的可见性,无论是在主文件还是子文件中。我通过使用if
条件和注释包来实现这一点。但主文件无法编译。一个最小示例如下:
子文件:
%!TeX root = sub.tex
\documentclass[class=article,crop=false,12pt]{standalone}
\usepackage{comment}
\newif\ifsolution
\solutiontrue
\ifsolution
\newenvironment{solution}{\medskip\textbf{Solution: }\ignorespaces}{}
\else
\excludecomment{solution}
\fi
\begin{document}
\subsection{Title}
Problem text.
\begin{solution}
Solution text.
\end{solution}
\end{document}
主文件:
\documentclass[12pt,a4paper,onecolumn]{article}
\usepackage[subpreambles=false]{standalone}
\usepackage{comment}
\newif\ifsolution
%\solutiontrue
\ifsolution
\newenvironment{solution}{\medskip\textbf{Solution: }\ignorespaces}{}
\else
\excludecomment{solution}
\fi
\title{Big Title}
\begin{document}
\maketitle
\input{sub.tex}
\end{document}
请注意,两个文件中的序言是相同的。\solutiontrue
可以注释(取消注释)该语句以切换解决方案。
虽然子文件编译正常,但主文件却不行,并出现错误Incomplete \iffalse; all text was ignored after line 17.
(第 17 行就在之后\title
,错误发生在包含的行上\input
。
错误是由子文件中的\newif
...\fi
块引起的。可以通过将此块移动到单独的文件并将\input
其放入子文件中来避免此错误。我不想这样做,因为我希望能够轻松切换解决方案。
看来 standalone 无法if
在前导码中处理这个问题,尽管我的理解是它应该完全丢弃子文件前导码直到\begin{document}
。这是正确的吗?有办法解决这个问题吗?
答案1
低级\if
命令在 TeX 中相当特殊。即使 TeX 跳过文本并将其丢弃,它也会看见它们。因此,在您的情况下,当编译 main.tex 时,TeX 会\ifsolution
在 sub.tex 中看见 ,并且很不高兴它没有\fi
。
改用 etoolbox 中的布尔值:
\usepackage{etoolbox}
\newbool{solution}
%\booltrue{solution}
\ifbool{solution}
{\newenvironment{solution}{\medskip\textbf{Solution: }\ignorespaces}{}}
{\excludecomment{solution}}