Re: Decisione errata in base a confronto tra dimensioni

#81313
Up
0
Down
::


Metti i [tt]%[/tt] dove non servono e non li metti dove servono. 🙁 Ma il problema è che non termini l’espansione di [tt]\pgfgetarrowoptions{*}[/tt] e quindi [tt]\ifdim[/tt] è espanso prima che la dimensione sia assegnata.

`\documentclass{article}
\usepackage{tikz}
\makeatletter
\pgfarrowsdeclare{*}{*}
{%
\pgfutil@tempdima=\pgfgetarrowoptions{*}\relax
\advance\pgfutil@tempdima by -0.5\pgflinewidth
\pgfarrowsleftextend{+-0.5\pgflinewidth}%
\pgfarrowsrightextend{+\pgfutil@tempdima}%
}
{%
\pgfutil@tempdima=\pgfgetarrowoptions{*}\relax
\ifdim\pgfutil@tempdima>5pt
\PackageWarning{TikZ}{* arrow: tip length is too short for the selected line width}%
\fi
\advance\pgfutil@tempdima by -\pgflinewidth
\divide\pgfutil@tempdima by 2
\pgfsetdash{}{+0pt}%
\pgfpathcircle{\pgfqpoint{\pgfutil@tempdima}{0pt}}{\pgfutil@tempdima}%
\pgfusepathqfillstroke
}
\makeatother
\pgfsetarrowoptions{*}{3pt}
\begin{document}
\begin{tikzpicture}
\draw[-*] (0,0) — (1,0);
\end{tikzpicture}

\pgfsetarrowoptions{*}{10pt}
\begin{tikzpicture}
\draw[-*] (0,0) — (1,0);
\end{tikzpicture}

\end{document}`
Nel primo caso [tt]\relax[/tt] non è strettamente necessario, perché il token che segue è [tt]\advance[/tt], non espandibile. Nel secondo caso è decisivo.

Quando un condizionale dà un risultato inaspettato, il problema è quasi sempre perché viene eseguito prima che ai termini da confrontare siano stati attribuiti i valori corretti. L’assegnazione [tt]\pgfutil@tempdima=\pgfgetarrowoptions{*}[/tt] funziona perché evidentemente la macro [tt]\pgfgetarrowoptions[/tt] è completamente espandibile. Ma la sua espansione è, nel tuo caso, [tt]3pt[/tt] e in un’assegnazione
`\pgfutil@tempdima=3pt`
TeX cerca di espandere sempre il token che segue, nei due casi [tt]\advance[/tt] e [tt]\ifdim[/tt]. Nel primo caso non succede nulla, perché il token non è espandibile; nel secondo è espandibile! Ops! L’assegnazione non è ancora completa e [tt]\pgfutil@tempdima[/tt] ha ancora il valore precedente. Puoi scegliere se lasciare uno spazio dopo la graffa o mettere [tt]\relax[/tt]. Meglio il secondo.

Nota che
`\ifdim\pgfgetarrowoptions{*}>5pt
\PackageWarning{TikZ}{* arrow: tip length is too short for the selected line width}%
\fi`
funzionerebbe, ma comunque vuoi assegnare quel valore a [tt]\pgfutil@tempdima[/tt], quindi tanto vale farlo prima.

Ciao
Enrico

Go to top