Tikz pic kollidiert mit \newcommand?

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Tikz pic kollidiert mit \newcommand?

von Rolli » Do 22. Feb 2018, 20:28

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

von Gast » Do 22. Feb 2018, 08:03

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.

Tikz pic kollidiert mit \newcommand?

von Rolli » Mi 21. Feb 2018, 22:19

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

Nach oben