Seite 1 von 1

Tikz pic kollidiert mit \newcommand?

Verfasst: Mi 21. Feb 2018, 22:19
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

Verfasst: Do 22. Feb 2018, 08:03
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.

Verfasst: Do 22. Feb 2018, 20:28
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