我使用和ltxdoc
类来记录。该文档目前需要兼容性选项,因为我的修改不适用于 的版本 3 。doc
doctools
prooftrees
doc2
doc
我目前正在尝试以类似的风格记录一个新软件包,但不使用兼容性选项。但是,我不知道如何通过 等更改边距中宏、环境等名称的格式\DescribeMacro
。\DescribeEnv
我创建了一个新命令,\NewDocElements
用于从列表中创建新元素并进行修改\PrintDescribeWhatever
以执行我想要的操作。这似乎运行正常(尽管索引可能需要改进)。
但是,如果我用 创建一个新元素\NewDocElement
,然后尝试修改\PrintDescribeWhatever
,它不起作用。此外,\RenewDocElement
对于宏和环境,也没有我期望的效果。
这是一个最小的例子:
\RequirePackage{svn-prov}
\ProvidesFileSVN{$Id: somedoc.tex 9678 2023-08-12 05:33:06Z someauthor $}[some version \revinfo]
\GetFileInfoSVN*
\let\somedocdocversion\fileversion
\let\somedocdocbase\filebase
\let\somedocdocinfo\fileinfo
\let\somedocdocdate\filedate
% BEGIN preamble
\documentclass{ltxdoc}
\usepackage{etoolbox,parskip,kantlipsum}
\usepackage[%
loadHyperref=true,
createIndexEntries=false,
]{doctools}
\makeatletter
\newcommand*\val[1]{{\ttfamily = \meta{#1}}}
\DeclareRobustCommand\macrolabelfont{\normalfont\footnotesize\em\normalcolor}
\newcommand*\macrolabelname{macro}
\newcommand*\PrintLabelName[2][\normalfont\normalsize\normalcolor]{#1#2}
\newcommand*\envlabelname{environment}
% \newcommand*\keylabelname{key}
\newcommand*\stylelabelname{style}
\def\somedoc@index#1#2{%doc.pdf v3 t15doc.pdf v3 t15
\index{\doctools@indexHeadFont{#1s}!#2}%
}
\NewDocumentCommand\keyname { s O {key} m }{%
\texttt{#3}%
\IfBooleanTF {#1}{}{%
\edef\tempa{\csname #2labelname\endcsname}%
\expandafter\somedoc@index{\tempa}{#3}%
}%
}
\RenewDocElement[% doc.pdf v3 t15
macrolike = true ,
toplevel = true,
idxtype = macro,
idxgroup = Macros,
printtype = \macrolabelname{}
]{Macro}{macro}
\RenewDocElement[% doc.pdf v3 t15
macrolike = false ,
toplevel = true,
idxtype = environment,
idxgroup = Environments,
printtype = \envlabelname{}
]{Env}{environment}
\NewDocElement[%
macrolike = false,
toplevel = true,
idxtype = style,
idxgroup = Styles,
printtype = \stylelabelname{}
]{Style}{style}
\ExplSyntaxOn
\clist_new:N \l__somedoc_doc_vals_clist
\NewDocumentCommand \NewDocElements { s m } {
\clist_set:Nn \l__somedoc_doc_vals_clist { #2 }
\clist_map_inline:Nn \l__somedoc_doc_vals_clist
{
\NewDocElement[%
macrolike = false,
toplevel = true,
idxtype = ##1,
idxgroup = \text_titlecase:n {##1s},
printtype = \csname ##1 labelname\endcsname
]{\text_titlecase:n {##1}}{##1}
\IfBooleanF { #1 }
{
\ifcsdef { ##1 labelname } {
\edef\tempa{Label~already~defined~for~##1}\show\tempa
}{
\expandafter\gdef\csname ##1 labelname \endcsname{ ##1 }
}
}
\expandafter\def\csname PrintDescribe \text_titlecase:n {##1} \endcsname####1{% addaswyd o doctools t18
\strut \MacroFont
\color{doctools@ColorCodeNames}
\clist_map_inline:nn { ####1 }
{
########1\par
}
\PrintLabelName[\macrolabelfont] {\csname ##1 labelname\endcsname}
}
}
}
\def\PrintDescribeStyle#1{%
\strut \MacroFont
\color{doctools@ColorCodeNames}
\clist_map_inline:nn { #1 }
{
##1\par
}
\PrintLabelName[\macrolabelfont] {\csname ##1 labelname\endcsname}
}
\def\PrintDescribeMacro#1{% addaswyd o doctools t18
\strut \MacroFont
\color{doctools@ColorCodeNames} \string #1\par
\PrintLabelName[\macrolabelfont] {\macrolabelname}%
}
\def\PrintDescribeEnv#1{% addaswyd o doctools t18
\strut \MacroFont
\color{doctools@ColorCodeNames}
\clist_map_inline:nn { #1 }
{
##1\par
}
\PrintLabelName[\macrolabelfont] {\envlabelname}%
}
\ExplSyntaxOff
\NewDocElements{colour,key}
\makeatother
\makeindex
% END preamble
\begin{document}
\DescribeMacro{\mymacro}\marg{something}\AfterLastParam
What \cs{mymacro} does.
\DescribeEnv{myenv,myotherenv}\oarg{something}\AfterLastParam
What \keyname[env]{myenv} and \keyname[env]{myotherenv} do.
\DescribeKey{mykey,myotherkey}\val{some value}\AfterLastParam
What \keyname{mykey} and \keyname{myotherkey} do.
\kant[1]
\DescribeColour{mycolour,myothercolour}
What \keyname[colour]{mycolour} and \keyname[colour]{myothercolour} do.
\kant[2]
\DescribeStyle{mystyle,myotherstyle}\val{key-value list}\AfterLastParam
What \keyname[style]{mystyle} and \keyname[style]{myotherstyle} do.
\end{document}
我想要的输出由key
和的情况演示。我试图更改的输出由、和colour
的情况演示。也就是说,对于和,我希望在不同的行上使用不同的变体,并且对于所有这三个,我希望在名称下方打印适当的标签(、、 )。macro
env
style
env
style
macro
environment
style
我特别困惑style
为什么它不起作用。我肯定忽略了一些显而易见的东西,但我就是看不出来。
答案1
感谢@mbert(他没有时间回答但建议我回答),我现在有了可以运行的代码。
我的原始代码实际上至少存在两个问题。第一个问题完全是我的错;第二个问题是由于 的一个未记录(或记录不足?)功能造成的doc.sty
。
简单的问题是修复这种style
情况:
\def\PrintDescribeStyle#1{%
\strut \MacroFont
\color{doctools@ColorCodeNames}
\clist_map_inline:nn { #1 }
{
##1\par
}
\PrintLabelName[\macrolabelfont] {\stylelabelname}
}%
我原本有
\PrintLabelName[\macrolabelfont] {\csname ##1 labelname\endcsname}
这没有任何意义,但是并没有引发错误。##1
此时没有定义,因为我们已经退出循环,并且无论如何都不会引用正确的东西。\csname ##1 labelname\endcsname
应该只是\stylelabelname
。
第二个问题特定于macro
和env
。尽管doc
的手册声称宏\PrintDescribeMacro
可以在加载包后重新定义,但它们在加载\begin{document}
if之前无法有效地重新定义,因为正如 mbert 指出的那样,在钩子中重新定义它们。这不是它目前唯一做的事情,但它在这里是最相关的。hyperref
doc.sty
begindocument/before
解决方案是在钩子之后或钩子中修改这些案例\begin{document}
。我尝试过\AddToHook{begindocument/before}...
这样做,但无法成功。但是,它确实适用于简单情况\AtBeginDocument
(这是 mbert 最初建议的)。
\RequirePackage{svn-prov}
\ProvidesFileSVN{$Id: somedoc.tex 9678 2023-08-12 05:33:06Z someauthor $}[some version \revinfo]
\GetFileInfoSVN*
\let\somedocdocversion\fileversion
\let\somedocdocbase\filebase
\let\somedocdocinfo\fileinfo
\let\somedocdocdate\filedate
% BEGIN preamble
\documentclass[]{ltxdoc}
\usepackage{etoolbox,kantlipsum,parskip}
\usepackage[%
loadHyperref=true,
createIndexEntries=false,
]{doctools}
\makeatletter
\newcommand*\val[1]{{\ttfamily = \meta{#1}}}
\DeclareRobustCommand\macrolabelfont{\normalfont\footnotesize\em\normalcolor}
\newcommand*\macrolabelname{macro}
\newcommand*\PrintLabelName[2][\normalfont\normalsize\normalcolor]{#1#2}
\newcommand*\envlabelname{environment}
% \newcommand*\keylabelname{key}
\newcommand*\stylelabelname{style}
\def\somedoc@index#1#2{%doc.pdf v3 t15doc.pdf v3 t15
\index{\doctools@indexHeadFont{#1s}!#2}%
}
\NewDocumentCommand\keyname { s O {key} m }{%
\texttt{#3}%
\IfBooleanTF {#1}{}{%
\edef\tempa{\csname #2labelname\endcsname}%
\expandafter\somedoc@index{\tempa}{#3}%
}%
}
\NewDocElement[%
macrolike = false,
toplevel = true,
idxtype = style,
idxgroup = Styles,
printtype = \stylelabelname
]{Style}{style}
\ExplSyntaxOn
\clist_new:N \l__somedoc_doc_vals_clist
\NewDocumentCommand \NewDocElements { s m } {
\clist_set:Nn \l__somedoc_doc_vals_clist { #2 }
\clist_map_inline:Nn \l__somedoc_doc_vals_clist
{
\NewDocElement[%
macrolike = false,
toplevel = true,
idxtype = ##1,
idxgroup = \text_titlecase:n {##1s},
printtype = \csname ##1 labelname\endcsname
]{\text_titlecase:n {##1}}{##1}
\IfBooleanF { #1 }
{
\ifcsdef { ##1 labelname } {
\edef\tempa{Label~already~defined~for~##1}\show\tempa
}{
\expandafter\gdef\csname ##1 labelname \endcsname{ ##1 }
}
}
\expandafter\def\csname PrintDescribe \text_titlecase:n {##1} \endcsname####1{% addaswyd o doctools t18
\strut \MacroFont
\color{doctools@ColorCodeNames}
\clist_map_inline:nn { ####1 }
{
########1\par
}
\PrintLabelName[\macrolabelfont] {\csname ##1 labelname\endcsname}
}
}
}
\DeclareHookRule{begindocument/before}{somedoc/hyperref}{after}{doc/hyperref}
% \AddToHook{begindocument/before}[somedoc/hyperref]
\AtBeginDocument{%
\RenewDocElement[% doc.pdf v3 t15
macrolike = true ,
toplevel = true,
idxtype = macro,
idxgroup = Macros,
printtype = \macrolabelname
]{Macro}{macro}%
\RenewDocElement[% doc.pdf v3 t15
macrolike = false ,
toplevel = true,
idxtype = environment,
idxgroup = Environments,
printtype = \envlabelname
]{Env}{environment}%
\def\PrintDescribeStyle#1{%
\strut \MacroFont
\color{doctools@ColorCodeNames}
\clist_map_inline:nn { #1 }
{
##1\par
}
\PrintLabelName[\macrolabelfont] {\stylelabelname}
}%
\def\PrintDescribeMacro#1{% addaswyd o doctools t18
\strut \MacroFont
\color{doctools@ColorCodeNames} \string #1\par
\PrintLabelName[\macrolabelfont] {\macrolabelname}%
}%
\def\PrintDescribeEnv#1{% addaswyd o doctools t18
\strut \MacroFont
\color{doctools@ColorCodeNames}
\clist_map_inline:nn { #1 }
{
##1\par
}
\PrintLabelName[\macrolabelfont] {\envlabelname}%
}%
}
\ExplSyntaxOff
\NewDocElements{colour,key}
\makeatother
\makeindex
% \ShowHook{begindocument/before}
% END preamble
\begin{document}
\DescribeMacro{\mymacro}\marg{something}\AfterLastParam
What \cs{mymacro} does.
\DescribeEnv{myenv,myotherenv}\oarg{something}\AfterLastParam
What \keyname[env]{myenv} and \keyname[env]{myotherenv} do.
\DescribeKey{mykey,myotherkey}\val{some value}\AfterLastParam
What \keyname{mykey} and \keyname{myotherkey} do.
\kant[1]
\DescribeColour{mycolour,myothercolour}
What \keyname[colour]{mycolour} and \keyname[colour]{myothercolour} do.
\kant[2]
\DescribeStyle{mystyle,myotherstyle}\val{key-value list}\AfterLastParam
What \keyname[style]{mystyle} and \keyname[style]{myotherstyle} do.
\end{document}