Menu

HowTo_Tagging

Markus Kohm

Wie man Tagging mit \DocumentMetadata mit KOMA-Script nutzen kann

Derzeit sind die meisten KOMA-Script-Pakete und die KOMA-Script-Klassen nicht auf Tagging oder die Verwendung von \DocumentMetadata eingerichtet. Das hat viel damit zu tun, dass für KOMA-Script über die Jahre viele internen Anweisungen, die LaTeX für Klassen- und Paketautoren bereitstellt, durch Eigenentwicklungen ersetzen musste, um die Vielzahl an Möglichkeiten überhaupt bereitstellen zu können. Bei Verwendung von \DocumentMetadata – mittlerweile Voraussetzung für Tagging – werden viele LaTeX-Interna durch latex-lab ersetzt. Vieles davon ist noch nicht in Stein gemeißelt. Dieser halbfertige Zustand hat in der Vergangenheit mehrfach dazu geführt, dass bereits begonnene Entwicklungen hauptsächlich verschwendete Zeit waren. Gleichzeitig überschreibt allein das Laden von latex-lab viele Definitionen von KOMA-Script, so dass einiges sicher nicht mehr so funktioniert, wie in der Anleitung dokumentiert.

Dennoch arbeitet Marei Peischl bereits an Tagging-Unterstützung in KOMA-Script. Daneben bietet KOMA-Script diverse Hooks, über die für einzelne Dokumente und einzelne Elemente Tagging realisiert werden kann.

Tagging von Überschriften

Das hier gezeigte Beispiel für das Tagging von Überschriften in den KOMA-Script-Klassen basiert auf Code, den Ulrike Fischer in der Diskussion mit den KOMA-Script-Entwicklern bereitgestellt hat. Es basiert auf neusten Versionen des LaTeX-Kerns und von latex-lab. Daher wird die Verwendung von lualatex-dev für die Übersetzung empfohlen. Selbstverständlich kann auch nicht garantiert werden, dass das mit zukünftigen Versionen von KOMA-Script oder dem LaTeX-Kern oder latex-lab noch genauso funktionieren wird. Im Gegenteil ist spätestens, wenn KOMA-Script selbst Tagging für Überschriften bieten wird, eher garantiert, dass das so nicht mehr funktioniert.

\DocumentMetadata{uncompress,tagging=on}
\documentclass{scrbook}

% See https://sourceforge.net/p/koma-script/wiki-de/HowTo_Tagging for more information an up-to-date code.
\ExplSyntaxOn\makeatletter

\int_new:N\l__scr_sec_level_int

\NewTaggingSocket{scr/heading/init}{1}
\NewTaggingSocketPlug{scr/heading/init}{default}
 {  
   \int_set:Nn\l__scr_sec_level_int{\use:c{toclevel@#1}}   
   \UseTaggingSocket{sec/end}{\int_use:N\l__scr_sec_level_int}
   \UseTaggingSocket{sec/begin}
    {{\int_use:N\l__scr_sec_level_int}{tag=\UseStructureName{sec/\int_use:N\l__scr_sec_level_int}}}   
   \if@startsection@runin  
    \UseTaggingSocket{sec/title/init}{\int_use:N\l__scr_sec_level_int}    
   \fi  
 }
\AssignTaggingSocketPlug{scr/heading/init}{default}  

\NewTaggingSocket{scr/heading/begin}{1}
\NewTaggingSocketPlug{scr/heading/begin}{default}
 {
   \pdf_purify:nN{\@currenttocentry}\l__scr_sec_tmpa_tl
   \int_set:Nn\l__scr_sec_level_int{\use:c{toclevel@#1}}   
   \if@startsection@runin        
   \else 
   \tagstructbegin{tag=\UseStructureName{sec/\int_use:N\l__scr_sec_level_int/title},title-o=\l__scr_sec_tmpa_tl}%
   \tagmcbegin{}\tagpdfparaOff
   \fi 
 }
\AssignTaggingSocketPlug{scr/heading/begin}{default} 

\NewTaggingSocket{scr/heading/end}{1}
\NewTaggingSocketPlug{scr/heading/end}{default}
 {
   \if@startsection@runin
    \UseTaggingSocket{sec/title/split}
   \else 
   \tagmcend\tagstructend 
   \fi  
 }
\AssignTaggingSocketPlug{scr/heading/end}{default}  

\AddtoDoHook{heading/preinit}{\@startsection@runinfalse\@gobble}% because styles chapter and part do not use \scr@startsection
\AddtoDoHook{heading/postinit}  {\UseTaggingSocket{scr/heading/init}}
\AddtoDoHook{heading/begingroup}{\UseTaggingSocket{scr/heading/begin}}
\AddtoDoHook{heading/endgroup}  {\UseTaggingSocket{scr/heading/end}}

%\AddtoDoHook{heading/postinit} {\__scr_sec_show_runin:n}

\cs_new:Nn \__scr_sec_show_runin:n
 {
   \if@startsection@runin \tl_show:n{#1:~runin}\else \tl_show:n{#1:~display}\fi
 }

\ExplSyntaxOff

\begin{document}
\tableofcontents

\part{Part}
\chapter{blub}
\section{section}
some text
\subsection{subsection}
some text\footnote{hallo}

\section{section}
some text


\paragraph{bla} hallo world

\paragraph{blub}\begin{itemize}\item a \end{itemize}
blbl

\part*{Part}
\chapter*{blub}
\section*{section}
some text
\subsection*{subsection}
some text\footnote{hallo}

\section*{section}
some text


\paragraph*{bla} hallo world

\paragraph*{blub}\begin{itemize}\item a \end{itemize}
blbl
\end{document}

Das gezeigte Beispiel hat noch ein paar Einschränkungen, beispielsweise:

  • Die Nummern der Überschriften werden nicht extra getaggt, was aber auch nicht so wichtig ist.
  • \part hat am Anfang eine leere Struktur, die da eigentlich nicht hin gehört.
  • Das Inhaltsverzeichnis verweist auf die Sect-Strukturen, was aber nur ein Problem wird, wenn jemand die Sect-Strukturen unterdrückt.
  • Es gibt dennoch Warnungen insbesondere wegen der Verwendung von \DocumentMetadata und des aktivierten Taggings.

KOMA-Script-Pakete, die bezüglich des Taggings derzeit als unkritisch betrachtet werden

  • scraddr (Hier gibt es nichts zu taggen.)
  • scrbase (Hier gibt es nichts zu taggen.)
  • scrdate (ACHTUNG: Ist ab KOMA-Script 3.49.3 nicht mehr in KOMA-Script enthalten.)
  • scrfontsize (Hier gibt es nichts zu taggen.)
  • scrlfile (Erzeugt keine Ausgaben, also muss auch nichts getaggt werden.)
  • scrlogo (Hier gibt es nichts zu taggen, es könnte allenfalls ein ALT-Text generiert werden.)
  • scrtime (ACHTUNG: Ist ab KOMA-Script 3.49.3 nicht mehr in KOMA-Script enthalten.)
  • typearea (Hier gibt es nichts zu taggen.)

MongoDB Logo MongoDB