通过阅读文件内容(LaTeX 的标准书籍类),我发现和book.cls
有很多用途。我似乎不明白为什么在某些情况下使用一个,而在其他情况下使用另一个。我找不到规律。\def
\newcommand
\def
我理解和之间的区别\newcommand
,并且我知道在日常文档写作中我应该更喜欢后者。但是,我的问题是关于类和包开发的上下文。例如,我可以\title
为我的新书类定义一个命令,该命令也接受副标题作为可选参数,方法是编写
\def\doc@title{}
\def\doc@subtitle{}
\def\title{\kernel@ifnextchar[{\@@title}{\@title}%
\def\@title#1{
\@@title[]{#1}%
}
\def\@@title[#1]#2{%
\gdef\doc@subtitle{#1}
\gdef\doc@title{#2}
}
不过我也可以说,
\newcommand\doc@title{}
\newcommand\doc@subtitle{}
\newcommand{\title}[2][]{
\gdef\doc@subtitle{#1}
\gdef\doc@title{#2}
}
在前面的代码片段中,是否有理由选择其中一种方法而不是另一种方法?
类似地,该book.cls
文件有这一行:
\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
为什么不写成
\DeclareOption{10pt}{\def\@ptsize{0}}
\newcommand
在课程/包开发中,在某些情况下使用什么标准,在其他情况下使用什么标准\def
?
答案1
使用 expl3,所有\XX_new:N
命令系列及其细微差别也会进入画面。:)
Expl3 是很多更容易编码。
不过,其基本答案(哲学答案)与链接问题相同。
平均能量损失
% arara: lualatex
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \g_ds_doctitle_tl
\tl_new:N \g_ds_docsubtitle_tl
\tex_def:D \mymeta #1 {
\textsf{\textbf{ #1 }}
}
\tex_def:D \commandbuild #1#2#3 {
\c_backslash_str
#1
\c_underscore_str
#2
\c_colon_str
#3
}
\tex_def:D \texdef {
\begin{center}
The ~ difference ~ between ~ X ~ and ~ Y
\end{center}
\begin{center}
\mymeta { \commandbuild {tex}{def}{D} } ~ and ~ all ~ the ~
\mymeta { \commandbuild {XX}{new}{N} } ~ commands
\end{center}
}
\NewDocumentCommand { \mytitle } { o +m } {
\tl_gset:Nx \g_ds_doctitle_tl { #2 }
\IfValueT { #1 }
{
\tl_gset:Nx \g_ds_docsubtitle_tl { #1 }
\regex_replace_all:nnN
{ (subtitle)+ }
{ \c{underline} \cB\{ \0 \cE\} }
\g_ds_docsubtitle_tl
\tl_gput_left:Nn \g_ds_docsubtitle_tl
{
\vspace { 2\tex_baselineskip:D }
\begin{center}
}
\tl_gput_right:Nn \g_ds_docsubtitle_tl
{
\end{center}
}
\tl_gput_right:Nn \g_ds_doctitle_tl
{
\large \upshape
}
\tl_gput_right:NV \g_ds_doctitle_tl \g_ds_docsubtitle_tl
}
\tl_gput_left:Nn \g_ds_doctitle_tl { \Large }
\tl_gput_right:Nn \g_ds_doctitle_tl { \texdef }
}
\NewDocumentCommand { \printtitle } { } {
\tl_if_empty:NF \g_ds_doctitle_tl
{
\group_begin:
\center
\itshape
\tl_use:N \g_ds_doctitle_tl
\group_end:
}
}
\ExplSyntaxOff
\mytitle[My subtitle A]{Multiparagraph
My Title A}
%============ document
\begin{document}
\printtitle
\end{document}