Tikz pic kollidiert mit \newcommand?

Tabellen und Grafiken erstellen und anordnen


Rolli
Forum-Guru
Forum-Guru
Beiträge: 406
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Tikz pic kollidiert mit \newcommand?

Beitrag von Rolli »

Hallo,

das untenstehende Beispiel (mittleres Bild) produziert reproduzierbar den Fehler:
ABD: EveryShipout initializing macros
! Argument of \language@active@arg" has an extra }.
<inserted text>
\par
1.38 }
Entfernt man den Teil "pic", funktioniert es (unteres Bild).
Es hat den Anschein, dass pic in einem \newcommand nicht funktioniert.
Bug oder Feature?
Was muss ich ändern, damit es funktioniert?
\documentclass [DIV=9,fontsize=8pt,paper=a5,parskip=half]{scrartcl}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[headsepline=3pt, footsepline=3pt]{scrlayer-scrpage}
\usepackage{xcolor}

\usepackage{tikz}
\usetikzlibrary{angles,quotes,babel}

\begin{document}

Funktionierendes Beispiel aus Pgfmanual Kapitel 18.2.1:

\begin{tikzpicture}
   \draw (3,0) coordinate (A)
      -- (0,1) coordinate (B)
      -- (1,2) coordinate (C)
    pic[draw, "$\alpha$"] {angle};
\end{tikzpicture}

Dasselbe Beispiel, mit \textbackslash newcommand aufgerufen, funktioniert nicht:

\newcommand{\MyAngle}[1]
{ 
   \begin{tikzpicture}
      #1
   \end{tikzpicture}
}

\MyAngle
{
      \draw (3,0) coordinate (A)
         -- (0,1) coordinate (B)
         -- (1,2) coordinate (C)
       pic[draw, "$\alpha$"] {angle};
}

Löscht man den pic ...-Teil, geht es:

\MyAngle
{
      \draw (3,0) coordinate (A)
         -- (0,1) coordinate (B)
         -- (1,2) coordinate (C);
}

\end{document}
Gruß vom Rolli

Gast

Beitrag von Gast »

Das Problem ist, dass \MyAngle die Argumente bereits liest und in Token umwandelt. Damit ist das durch babel aktive " bereits gelesen und verarbeitet, wenn die tikzpicture-Umgebung zum Zuge kommt. Die babel-Library kann also bezüglich der "-Auswertung nichts mehr ausrichten. Dasselbe Problem gibt es auch, wenn man tikzpicture in diversen anderen Umgebungen verwendet, beispielsweise:
\parbox{\textwidth}
{
  \begin{tikzpicture}
      \draw (3,0) coordinate (A)
         -- (0,1) coordinate (B)
         -- (1,2) coordinate (C)
         pic[draw, "$\alpha$"] {angle};
  \end{tikzpicture}
}
Man könnte jetzt natürlich folgendes machen:
\shorthandoff{"}
\MyAngle
{
      \draw (3,0) coordinate (A)
         -- (0,1) coordinate (B)
         -- (1,2) coordinate (C)
       pic[draw, "$\alpha$"] {angle};
}
\shorthandon{"}
Das ist aber zugegeben nicht schön. Die nächste Idee wäre, das shorthand in der Definition von \MyAngle abzuschalten. Aber wenn die Definition expandiert wird, sind die Token ja bereits gebildet (siehe oben). Also ist das zu spät. Man kann aber mit einem Trick arbeiten, indem man \MyAngle in zwei Makros aufteilt, bei denen das erste das shorthand abschaltet und erst das zweite das Argument liest:
\documentclass [DIV=9,fontsize=8pt,paper=a5,parskip=half]{scrartcl}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{tikz}
\usetikzlibrary{angles,quotes,babel}

\newcommand{\MyAngle}{%
  \begingroup
  \shorthandoff{"}%
  \MyAngleii
}
\newcommand{\MyAngleii}[1]
{
   \begin{tikzpicture}
     #1
   \end{tikzpicture}%
   \endgroup
}

\begin{document}

Funktionierendes Beispiel aus Pgfmanual Kapitel 18.2.1:

\begin{tikzpicture}
   \draw (3,0) coordinate (A)
      -- (0,1) coordinate (B)
      -- (1,2) coordinate (C)
    pic[draw, "$\alpha$"] {angle};
\end{tikzpicture}

Dasselbe Beispiel, mit \verb|\newcommand| aufgerufen, funktioniert:

\MyAngle
{
      \draw (3,0) coordinate (A)
         -- (0,1) coordinate (B)
         -- (1,2) coordinate (C)
       pic[draw, "$\alpha$"] {angle};
}

M"utterchen jetzt geht es!

\end{document}
Den letzten Satz habe ich eingefügt, um zu demonstrieren, dass \begingroup…\endgroup die Wirkung von \shorthandoff ebenfalls begrenzt, man also kein explizites \shorthandon benötigt.


Wer mehr auf den Namen des Verfassers gibt als auf den Inhalt eines Beitrags ist selbst schuld.

Rolli
Forum-Guru
Forum-Guru
Beiträge: 406
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag von Rolli »

Ok - danke für die Informationen mit den vielen Internas zu TeX. Vermutlich muss ich mich doch intensiv damit beschäftigen. Habe es jetzt wie von Dir vorgeschlagen mit den zwei \newcommands gelöst und es funktioniert - Danke!
Gruß vom Rolli

Antworten