有没有办法设计一个 LaTeX 模板,它可以强制执行给定的章节、小节等,或者如果编译时缺少给定的章节标签则生成错误?
例如,假设我对所有使用我的模板的文档始终都需要此功能:
\section{Introduction [Code 123]}
\section{Conclusions [Code 345]}
假设其他部分不受限制地被允许,并且必需的部分需要按照给定的顺序出现。
我如何在模板中以编程方式执行这一点?
谢谢!
答案1
您可以重新定义\section
命令来设置各种标志,以便我们可以进行适当的检查。
缺少以下两个部分的文档:
\begin{document}
\section{Summary}
\section{Discussion}
\end{document}
将排版如下:
请注意,特定于该Introduction
部分的消息以青色显示,而与之相关的消息Conclusion
以洋红色显示。
文档中包含错误顺序的Introduction
和/或Conclusion
部分,或多次出现给定的部分:
笔记:
- 由于没有提供测试案例,因此只进行了最低限度的测试。需要进一步测试以确保涵盖所有案例。
- 我已经使用
\newtoggle
过包裹etoolbox
因为我更喜欢那个语法而不是\newif
语法。但如果你不想包含额外的包,那么调整它以使用\newif
或其他一些条件方法。 - 包裹
xstring
用于字符串比较。 - 正如你所看到的,我不太擅长选择搭配颜色。但是,在这种情况下,这反而是件好事,因为您实际上并不希望在文档中看到这些消息。
- 如果需要的话,您还可以使用
\PackageError
(参见注释代码)通过控制台消息退出。
代码:
\documentclass{article}
\usepackage{xcolor}
\usepackage{etoolbox}
\usepackage{xstring}
\usepackage{calc}
\newcommand*{\IntroSectionName}{Introduction [Code 123]}%
\newcommand*{\ConclusionSectionName}{Conclusions [Code 345]}%
\newtoggle{ErrorDetected}
\newtoggle{IntroSectionEncountered}
\newtoggle{ConclusionSectionEncountered}
\newcommand*{\ReportError}[2][yellow]{%
\global\toggletrue{ErrorDetected}%
\begingroup% Keep change of \fboxrule local
\setlength{\fboxrule}{6pt}%
\par\noindent\ignorespaces%
\fcolorbox{red}{#1}{\parbox{\linewidth-2\fboxrule-2\fboxsep}{\raggedright#2}}%
\endgroup%
}%
\newcommand*{\CheckErrors}{%
\iftoggle{IntroSectionEncountered}{}{%
\ReportError[cyan!50]{Intro section missing.}%
}%
\iftoggle{ConclusionSectionEncountered}{}{%
\ReportError[magenta!50]{Conclusion section missing.}%
}%
\iftoggle{ErrorDetected}{%
\ReportError{Errors detected.}%
%\PackageError{\jobname}{Error(s) detected.}{}%
}{}%
}%
\let\OldSection\section%
\renewcommand*{\section}[1]{%
\IfStrEq{#1}{\IntroSectionName}{%
\iftoggle{IntroSectionEncountered}{%
\ReportError[cyan!50]{Multiple Introduction sections.}%
}{}%
\iftoggle{ConclusionSectionEncountered}{%
\ReportError[cyan!50]{Introduction after Conclusion.}%
}{}%
\global\toggletrue{IntroSectionEncountered}%
}{}%
\IfStrEq{#1}{\ConclusionSectionName}{%
\iftoggle{ConclusionSectionEncountered}{%
\ReportError[magenta!50]{Multiple Conclusion sections.}%
}{}%
\iftoggle{IntroSectionEncountered}{}{%
\ReportError[magenta!50]{Conclusion before Introduction.}%
}%
\global\toggletrue{ConclusionSectionEncountered}%
}{}%
\OldSection{#1}%
}%
\AtEndDocument{\CheckErrors}
\begin{document}
\section{Conclusions [Code 345]}
\section{Introduction [Code 123]}
\section{Introduction [Code 123]}
\section{Conclusions [Code 345]}
\end{document}