我想重新定义\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}
,并接受\end
as 参数,这会中断。\@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}