Cómo funciona el comando newif

Cómo funciona el comando newif

Como no tengo respuestas a mis preguntas aquí:

Cómo dibujar líneas verticales usando el paquete pgfgantt, Decidí implementar mi propio comando que agregué al pgfgantt.styarchivo (he hecho una copia). Miré pgfgantt.styy encontré este código que funciona con un solo problema:

\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%
}

Este es sólo un ejemplo para demostrar que funciona. Esto es lo que obtengo con este código:

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

ingrese la descripción de la imagen aquí

Normalmente, la línea debe dibujarse debajo de la barra de título. Es este código el que define dónde empezamos a dibujar:

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

¿Cómo \ifgtt@includetitlefunciona? Se define así:

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

Respuesta1

\newif(en LaTeX) se define de la siguiente manera. (El original en formato simple tiene una definición ligeramente diferente).

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

Entonces \newiftoma un nombre de comando (que por convención siempre comienza con if) y define tres comandos

\newif\iffoodefine

\iffoo ser \iffalse y definir

\footrueser un comando que define \iffooser \iftruey define

\foofalseser un comando que define \iffooser \iffalse.

\iftruey \iffalseson primitivas que actúan como verdadero y falso respectivamente.

Entonces si tienes

\iffoo

  some code here

\fi

el código se ejecutará o no dependiendo de si anteriormente ejecutó \footruepara cambiar el significado de \iffooto \iftrue.

información relacionada