Hai ragione. E’ colpa mia. La questione è che quando le linee sono inclinate, una parte delle estremità sporge orizzontalmente, perché lo spessore non è nullo e la lunghezza di linea è calcolata a metà spessore. TikZ, per unire i due tratti obliqui, li prolunga finché i bordi sporgenti della linea non si intersecano. Se alfa è l’inclinazione della linea, allora la parte prolungata sporgerà orizzontalmente di 0.5cosec(alfa)\pgflinewidth, che nel nostro caso è 1.30656297\pgflinewidth, che si può arrotondare un po’ date le modeste dimensioni dello spessore di linea. Così dovrebbe andare
`
\documentclass{article}
\usepackage{tikz}
% Codice per lo stile della freccia
\pgfarrowsdeclare{freccia45}{freccia45}
{
\pgfarrowsleftextend{0pt}
\pgfarrowsrightextend{\pgfgetarrowoptions{freccia45}+1.307\pgflinewidth}
}
{
\pgfmathsetlengthmacro{\lun}{\pgfgetarrowoptions{freccia45}/cos(22.5)}
\pgfsetdash{}{+0pt}
\pgfsetmiterjoin
\pgfpathmoveto{\pgfpointadd{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}{\pgfqpointpolar{157.5}{\lun}}}
\pgfpathlineto{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}
\pgfpathlineto{\pgfpointadd{\pgfqpoint{\pgfgetarrowoptions{freccia45}}{0pt}}{\pgfqpointpolar{-157.5}{\lun}}}
\pgfpathclose
\pgfusepathqstroke
}
\def\miodef{0.4cm} % imposta il valore utilizzato per default
\pgfsetarrowoptions{freccia45}{\miodef} % valore utilizzato se /punta non viene invocato
\pgfkeys{/punta/.default=\miodef, /punta/.code={\pgfsetarrowoptions{freccia45}{#1}}}
\begin{document}
\begin{tikzpicture}
\draw [-freccia45, /punta=3pt] (0,3) — (3,3);
\draw [-freccia45, /punta] (0,2) — (3,2);
\draw [-freccia45, /punta=1cm] (0,1) — (3,1);
\draw [-freccia45] (0,0) — (3,0);
\draw (3,0) — (3,3);
\end{tikzpicture}`