LaTeX 模板强制预定义文档结构

LaTeX 模板强制预定义文档结构

有没有办法设计一个 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}

相关内容