Menu

HowTo_Tagging

Markus Kohm
There is a newer version of this page. You can find it here.

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.

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

\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.

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