如何通过 doctools 修改 doc 的 v3 文档宏?

如何通过 doctools 修改 doc 的 v3 文档宏?

我使用和ltxdoc类来记​​录。该文档目前需要兼容性选项,因为我的修改不适用于 的版本 3 。docdoctoolsprooftreesdoc2doc

我目前正在尝试以类似的风格记录一个新软件包,但不使用兼容性选项。但是,我不知道如何通过 等更改边距中宏、环境等名称的格式\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的情况演示。也就是说,对于和,我希望在不同的行上使用不同的变体,并且对于所有这三个,我希望在名称下方打印适当的标签(、、 )。macroenvstyleenvstylemacroenvironmentstyle

我特别困惑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

第二个问题特定于macroenv。尽管doc的手册声称宏\PrintDescribeMacro可以在加载包后重新定义,但它们在加载\begin{document}if之前无法有效地重新定义,因为正如 mbert 指出的那样,在钩子中重新定义它们。这不是它目前唯一做的事情,但它在这里是最相关的。hyperrefdoc.stybegindocument/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}

相关内容