独立包中子文件前言中的 if 语句存在问题

独立包中子文件前言中的 if 语句存在问题

我正在尝试使用独立包。这个想法是拥有一个大型的独立 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}}

相关内容