我现在有一个近乎哲学的问题。我不是 LaTeX 程序员,而是 LaTeX 最终用户(作家)。我收集了一组 LaTeX 样式文件,用于一本用 LaTeX 编写的非常精美的书。我的样式文件有时依赖于其他样式文件中的宏,并且正在导出宏。有时我也想在一个最小的示例中单独测试它们。
现在,我的计划是重新组织我的样式文件,如下所示:
在每个样式文件的顶部,比如说一个question.sty
文件,我首先把需要的导入放进去
\ProvidesPackage{question}[2022/04/01]
%% imports
\usepackage{xcolor} %% standard TL
\ProvideDocumentEnvironment{ threecolumn }%% my own macro hack facility, from elsewhere
{ \begin{center}\color{red} begin threecolumn \end{center} }
{ \begin{center}\color{red} end threecolumn \end{center} }
有了存根,我就可以单独在一个简单的 tex 文件中测试这个样式文件,尽管在其更花哨的形式中它将使用threecolumn
来自其他地方的环境。然后,接下来是这个样式文件实际上提供的内容,以供快速参考,而无需深入研究实现细节。
%% exports
\ProvideDocumentCommand{\question}{ O{red} m }{}
(编辑 --- 大卫卡莱塞尔正确地建议,上述内容可能最好是\NewDocumentCommand
)
接下来将会有更长的文档、变更日志等。有点像“pod”(perl)。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% question.sty
%%%
%%% this provides a nicely formatted question macro,
%%% with one argument blah blah blah
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
最后,我有了实际的实现,通常是混乱的、拼凑起来的魔法,这些魔法来自多年来我在 tex.stackexchange 上收到的大量帮助(其中有一半我不理解,但我非常感谢)。
\RenewDocumentCommand{\question}{ O{red}m }{
\begin{threecolumn}
\textcolor{#1.} #2
\end{threecolumn}
}
任何其他宏都\question
可能需要在其中包含“@”,并且需要\makeatletter
。
- 这是一个好计划吗?
- 这是在重新发明轮子还是忽略了对我这样的最终用户/作家有用的现有乳胶风格设施?
答案1
我认为使用它没有任何好处,\ProvideDocumenCommand
它只会让事情变得更慢,文档价值也值得怀疑。它还完全掩盖了你的软件包与其他软件包的现有代码之间的软件包冲突。
如果你的包打算定义一个新\question
命令,那么如果你使用自然形式
\NewDocumentCommand{\question}{ O{red}m }{% don't forget %
\begin{onecolumn}%
\textcolor{#1.} #2%
\end{onecolumn}%
}
然后,如果您不小心将一些其他代码加载到已经定义过该代码的文档中,您就会收到错误并可以调整包加载。
但是,您的\Provide..
\Renew...
组合将始终默默地覆盖现有定义,而不会发出任何警告。这就像使用\def
并否定 LaTeX\New...
定义形式所做的所有检查一样