用于重新定义可访问性标记部分的宏不适用于 \tableofcontents

用于重新定义可访问性标记部分的宏不适用于 \tableofcontents

我编写了一个宏来使用该tagpdf包标记章节标题。除非我有\tableofcontents指令,否则它可以正常工作。在这种情况下,任何带星号的部分(例如内容部分本身)都会在目录中用星号替换。我想知道是否有更有经验的 LaTeX 宏编写者可以告诉我我在宏中做错了什么。以下是一个最小可重现的示例。它必须与最新版本的 lualatex 一起运行才能正常工作。

\RequirePackage{pdfmanagement-testphase}
\DeclareDocumentMetadata{testphase=tagpdf,activate=tagging,uncompress}
\documentclass[12pt]{article}
\usepackage{letltxmacro}
\LetLtxMacro{\oldsection}{\section}
\makeatletter
\renewcommand{\section}[1]{%
  \@ifstar{%
    \tagpdfparaOff\tagstructbegin{tag=H1}\tagmcbegin{tag=H1}%
    \oldsection*{#1}\tagmcend\tagstructend\tagpdfparaOn%
  }{%
    \tagpdfparaOff\tagstructbegin{tag=H1}\tagmcbegin{tag=H1}%
    \oldsection{#1}\tagmcend\tagstructend\tagpdfparaOn%
  }%
}%
\makeatother

\begin{document}

\tableofcontents

\section{bla}
bla bla bla

\section{bla bla}
bla bla bla

\subsection{bla bla bla}
bla bla bla

\end{document}

答案1

您为 \section 提供了一个参数,然后使用\section*星号就是这个参数。您\@ifstar没有做任何有用的事情。类似这样的操作适用于 lualatex(对于 pdflatex,这不是一个好方法,因为标记会影响间距和分页)。

但这只是一个临时的解决方案,直到分段命令能够提供适当的钩子为止。

\RequirePackage{pdfmanagement-testphase}
\DeclareDocumentMetadata{testphase=tagpdf,activate=tagging,uncompress}
\documentclass[12pt]{article}
\NewCommandCopy\oldsection\section

\RenewDocumentCommand\section{som}
 {%
   \par%ensure that you are in vmode
   \tagpdfparaOff\tagstructbegin{tag=H1}\tagmcbegin{tag=H1}%
   \IfBooleanTF {#1}%test the star
   {%
    \IfValueTF{#2}% test the optional argument
     {\oldsection*[#2]{#3}}
     {\oldsection*{#3}}%
   }  
   {%
    \IfValueTF{#2}% test the optional argument
     {\oldsection[#2]{#3}}
     {\oldsection{#3}}%
   }%
  \tagmcend\tagstructend\tagpdfparaOn 
}


\begin{document}

\tableofcontents

\section{bla}
bla bla bla

\section{bla bla}
bla bla bla

\subsection{bla bla bla}
bla bla bla

\end{document}

相关内容