某些类型的出版物(例如模块文档)具有清晰的结构(例如,第一个出版物有一个介绍部分,最后提供源代码,...)
我想知道 LaTeX 或某些软件包是否可以强制用户遵守给定的结构。如果用户未能按照指定的结构编写文档,至少应该打印一条警告。
答案1
据我所知,你无法强制执行结构,只能以\section
不同的顺序出现。但你可以扩展(模仿)该\maketitle
机制。
定义一些宏,例如
\newcommand{\mc@introduction}{}
\newcommand{\introduction}[1]{%
\renewcommand{\mc@introduction}{#1}%
}
(mc@
前缀可以自由选择。我将其用于mc
MyClass...)并在宏中使用它们,例如\makedocument
\newcommand{\makedocument}{%
Some text
\addsec{Introduction}
\mc@introduction
\let\makedocument\relax
}
最后一行确保\makedocument
不能使用两次。etoolbox
您可以\makedocument
在文档末尾自动调用。
\AtEndDocument{\makedocument}
如果必须提供某些信息,您可以\mc@introduction
像这样初始化宏
\newcommand{\mc@introduction}{
\ClassError{myclass}{\string\introduction\space not used.}{%
You must provide the introduction.
}
}
当你重新定义时,\section
你可以允许在文档中使用它
\renewcommand{\section}[1][]{%
\ClassError{myclass}{Don't use \string\section}{%
You are not allowed to use \string\section
in your document!
}
}
但你必须保存定义前重新定义如果你想使用\makedocument
它
\let\addsec\section
这是一个完整但非常基本的例子:
% myclass-test.tex
\documentclass{myclass}
\begin{document}
\faqs{The order in the document won't change anything.}
\introduction{Text}
%\section{Test}% caues an error
%\makedocument% optional
\end{document}
% myclass.cls
\ProvidesClass{myclass}
\LoadClassWithOptions{article}
\RequirePackage{etoolbox}
\newcommand{\mc@introduction}{
\ClassError{myclass}{\string\introduction\space not used.}{%
You must provide the introduction.
}
}
\newcommand{\introduction}[1]{%
\renewcommand{\mc@introduction}{#1}%
}
\newcommand{\mc@information}{}
\newcommand{\information}[1]{%
\renewcommand{\mc@information}{#1}%
}
\newcommand{\mc@faqs}{}
\newcommand{\faqs}[1]{%
\renewcommand{\mc@faqs}{#1}%
}
\let\addsec\section
\renewcommand{\section}[1][2]{%
\ClassError{myclass}{Don't use \string\section}{%
You are not allowed to use \string\section
in your document!
}
}
\newcommand{\makedocument}{%
Some text that is always the same in
every single document.
\addsec{Introduction}
\mc@introduction
\addsec{Information}
\mc@information
\addsec{FAQs}
\mc@faqs
\let\makedocument\relax
}
\AtEndDocument{\makedocument}