So funktioniert der Befehl newif

So funktioniert der Befehl newif

Da ich hier keine Antworten auf meine Fragen bekommen habe:

So zeichnen Sie vertikale Linien mit dem Paket pgfgantt, ich habe beschlossen, meinen eigenen Befehl zu implementieren, den ich der pgfgantt.styDatei hinzugefügt habe (ich habe eine Kopie erstellt). Ich habe mir das angesehen pgfgantt.styund bin auf diesen Code gestoßen, der mit nur einem Problem funktioniert:

\newcommand\drawverticalline[1]{%
\begingroup%
\begin{pgfinterruptboundingbox}%
\begin{scope}
 \newif\ifgtt@includetitle
   \ganttset{%
      include title in canvas/.is if=gtt@includetitle,%
      include title in canvas
      }
   \gtt@tsstojulian{#1}{\gtt@today@slot}
   \gtt@juliantotimeslot{\gtt@today@slot}{\gtt@today@slot}%
   \ifgtt@includetitle%
    \def\y@upper{0}%
   \else%
     \pgfmathsetmacro\y@upper{%
      \gtt@lasttitleline * \ganttvalueof{y unit title}%
     }%
   \fi%
  \pgfmathsetmacro\y@lower{%
  \gtt@lasttitleline * \ganttvalueof{y unit title}%
  + (\gtt@currentline - \gtt@lasttitleline - 1)%
  * \ganttvalueof{y unit chart}%
  }%
  \pgfmathsetmacro\x@mid{%
     (\gtt@today@slot - 1 + \ganttvalueof{today offset})%
                    * \ganttvalueof{x unit}%
   }%
  \draw [/pgfgantt/today rule]
                (\x@mid pt, \y@upper pt) -- (\x@mid pt, \y@lower pt)
                node [/pgfgantt/today label node] {\ganttvalueof{today   label}};%
 \end{scope}
 \end{pgfinterruptboundingbox}%
  \endgroup%
}

Dies ist nur ein Beispiel, um zu zeigen, dass es funktioniert. Folgendes erhalte ich mit diesem Code:

\documentclass{article}
\usepackage[frenchb]{babel}  
\usepackage{pgfgantt}
\usetikzlibrary{shadows}

\begin{document}
\begin{tikzpicture} % optional
   \begin{ganttchart}[x unit=1.8mm, 
                  y unit chart=0.87cm, 
                  time slot format=isodate, 
                  vgrid=*{5}{dotted},
                 ]
                  {2014-04-14}{2014-07-11}
       \gantttitlecalendar{month=name} \\ 

       \ganttbar[progress=100]{title1}{2014-04-14}{2014-04-15} \\

       \ganttbar[progress=100]{title2}{2014-04-15}{2014-04-17} \\

       \drawverticalline{2014-05-07}
   \end{ganttchart}
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Normalerweise sollte die Linie unterhalb der Titelleiste gezeichnet werden. Dieser Code definiert, wo wir mit dem Zeichnen beginnen:

\ifgtt@includetitle%
  \def\y@upper{0}%
\else%
  \pgfmathsetmacro\y@upper{%
    \gtt@lasttitleline * \ganttvalueof{y unit title}%
  }%
\fi%

Wie \ifgtt@includetitlefunktioniert es? Es ist wie folgt definiert:

\newif\ifgtt@includetitle
\ganttset{%
    include title in canvas/.is if=gtt@includetitle,%
    include title in canvas
    }

Antwort1

\newif(in LaTeX) wird wie folgt definiert. (Das Original in plain hat eine etwas andere Definition).

\def\newif#1{%
  \count@\escapechar \escapechar\m@ne
    \let#1\iffalse
    \@if#1\iftrue
    \@if#1\iffalse
  \escapechar\count@}
\def\@if#1#2{%
  \expandafter\def\csname\expandafter\@gobbletwo\string#1%
                    \expandafter\@gobbletwo\string#2\endcsname
                       {\let#1#2}}

Nimmt also \newifeinen Befehlsnamen (der nach Konvention immer mit beginnt if) und definiert drei Befehle

\newif\iffoodefiniert

\iffoo zu sein \iffalse und definiert

\footrueein Befehl zu sein, der definiert \iffoozu sein \iftrueund definiert

\foofalseein Befehl sein, der definiert, \iffoodass es ist \iffalse.

\iftrueund \iffalsesind Grundelemente, die jeweils als wahr und falsch fungieren.

Wenn Sie also

\iffoo

  some code here

\fi

Der Code wird ausgeführt oder nicht, je nachdem, ob Sie zuvor \footruedie Bedeutung von \iffooin geändert haben \iftrue.

verwandte Informationen