如何正确地重新定义 \maketitle 以在 LaTeX 中添加标记元素?

如何正确地重新定义 \maketitle 以在 LaTeX 中添加标记元素?

我想重新定义\maketitle命令,以便所有数据(作者、日期、致谢和标题)都用包标记tagpdf。在我看来,它应该在标题标签内。但是当我进行此标记时,我收到错误:

! Argument of \end has an extra }.
<inserted text>
\par
l.41 \maketitle{}

这是我的代码:

\documentclass{article}
\usepackage{tagpdf}
\tagpdfsetup{tabsorder=structure,uncompress,activate-all,add-new-tag=Title/P,interwordspace=true,tagunmarked=false}
\pagestyle{empty}
\ExplSyntaxOn
\makeatletter
\let\old@maketitle=\maketitle
\renewcommand{\maketitle}[1]{
\tagstructbegin{tag=Title}
\prop_if_exist:NTF{\l__data_of_title_prop}{}{
\prop_new:N {\l__data_of_title_prop}
\prop_put:Nnn{\l__data_of_title_prop}{@author}{H1}
\prop_put:Nnn{\l__data_of_title_prop}{@date}{H1}
\prop_put:Nnn{\l__data_of_title_prop}{@thanks}{H1}
\prop_put:Nnn{\l__data_of_title_prop}{@title}{H1}
\cs_new_protected:Nn \l__iter:nn
 {
\cs_set_eq:cc { orig@##1 } { ##1 }
\cs_gset_protected:cpn { ##1 } ####1
{
\tagstructbegin{tag=##2}
\tagmcbegin{tag=##2}
\use:c { orig@##1 } { ####1 }
\tagmcend
\tagstructend
}
}
}
\prop_map_function:NN \l__data_of_title_prop \l__iter:nn
\old@maketitle
\tagstructend
}
\makeatother
\ExplSyntaxOff
\author{alexandr Kozlovskiy}
\date{\today}
%\thanks{Alexandr Kozlovskiy} Why with \@thanks i get missing \begin{document} error?
\title{test document}
\begin{document}
\tagstructbegin{tag=Document}
\maketitle{}
\tagstructbegin{}tag=P}
\tagmcbegin{tag=P}
Test
\tagmcend
\tagstructend
\tagstructend
\end{document}

答案1

你正在定义:

\cs_gset_protected:cpn { ##1 } ####1
  {
    ...
    \use:c { orig@##1 } { ####1 }
    ...
  }

其中##1@author@title等。这将重新定义\@author为接受一个参数。但是然后\@author在 中使用\begin{tabular}{c}\@author\end{tabular},并接受\endas 参数,这会中断。\@author应该只包含作者姓名,因此正确的定义应该是没有####1

我还稍微移动了代码。我重命名了变量,__kozlovskiy在其名称中添加了一个通用模块(),我还将其重命名\l__iter:nn\__kozlovskiy_tag_elt:nn(前缀\l_、 或\g_、 或\c_仅用于变量,并且\l__iter:nn是一个函数。

我将 的定义移到了\__kozlovskiy_tag_elt:nn的定义之外\maketitle:最好先进行所有需要的定义,然后再使用它们。我将 的声明移到了 的\l__kozlovskiy_data_of_title_prop定义之外\maketitle,并使用 设置了它的项\prop_set_from_keyval:Nn

有点\thanks不同(因为\thanks与有点不同\author)。\author只是将参数存储在中\@author,而\thanks使用脚注标记时会排版并添加一个脚注文本到\@thanks,稍后进行排版。但是使用 定义\@thanks\protected,each\@thanks将扩展为自身,并且您将陷入无限循环。因此,您需要手动重新定义\thanks以将该文本添加到\orig@@thanks,这是将包含脚注并被标记的标记列表。

\documentclass{article}
\usepackage{tagpdf}
\tagpdfsetup{tabsorder=structure,uncompress,activate-all,add-new-tag=Title/P,interwordspace=true,tagunmarked=false}
\pagestyle{empty}
\ExplSyntaxOn
\prop_new:N \l__kozlovskiy_data_of_title_prop
\prop_set_from_keyval:Nn \l__kozlovskiy_data_of_title_prop
  {
    @author = H1 ,
    @date   = H1 ,
    @thanks = H1 ,
    @title  = H1 ,
  }
\makeatletter
\DeclareRobustCommand\thanks[1]{\footnotemark
    \protected@xdef\orig@@thanks{\orig@@thanks
        \protect\footnotetext[\the\c@footnote]{#1}}%
}
\makeatother
\cs_new_protected:Nn \__kozlovskiy_tag_elt:nn
  {
    \cs_gset_eq:cc { orig@#1 } { #1 }
    \cs_gset_protected:cpn { #1 }
      {
        \tagstructbegin{tag=#2}
          \tagmcbegin{tag=#2}
            \use:c { orig@#1 }
          \tagmcend
        \tagstructend
      }
  }
\cs_new_protected:Npn \kozlovskiy_maketitle:
  {
    \tagstructbegin{tag=Title}
      \prop_map_function:NN \l__kozlovskiy_data_of_title_prop
        \__kozlovskiy_tag_elt:nn
      \__kozlovskiy_original_maketitle:
    \tagstructend
  }
\cs_new_eq:NN \__kozlovskiy_original_maketitle: \maketitle
\cs_gset_protected:Npn \maketitle { \kozlovskiy_maketitle: }
\ExplSyntaxOff
%
\author{alexandr Kozlovskiy}
\date{\today}
\title{test document%
  \thanks{Alexandr Kozlovskiy}} % <- \thanks inside \title
\begin{document}
\tagstructbegin{tag=Document}
\maketitle
\tagstructbegin{tag=P}
\tagmcbegin{tag=P}
Test
\tagmcend
\tagstructend
\tagstructend
\end{document}

相关内容