Como emitir um aviso quando algo é cortado no TikZ?

Como emitir um aviso quando algo é cortado no TikZ?

Como o título indica, gostaria de saber se é possível emitir um aviso LaTeX se algo for cortado em um arquivo tikzpicture. E, se sim, como eu conseguiria isso?

Meu caso de uso é que estou trabalhando em um pequeno conjunto de macros para produzir desenhos e gostaria de receber um aviso se tiver desenhado algo fora de uma determinada área de desenho definida. Eu uso recorte no desenho para evitar que qualquer coisa fora da área seja desenhada. Isso evita que o layout da página fique bagunçado, mas o usuário não tem ideia de que algo não foi realmente colocado na página (além de inspecionar manualmente a saída). Seria bom avisar o usuário em meu caso de uso específico.

Idealmente, esse aviso seria ativado colocando um estilo, digamos clip warn, em um scopeambiente ou no próprio clipe \path.

Aqui está um MWE como ponto de partida e para fins de teste:

\documentclass{article}
\usepackage{tikz}
\tikzset{x=1em,y=1em}

\tikzset{
  clip warn/.style = {
    % insert magic code here
  },
}

\begin{document}

This diagram should not produce a warning: 
  \tikz{\path[clip] (0,0) rectangle (1,1); \draw (0.25,0.25) -- (0.75,0.75)}

This diagram should produce a warning: 
  \tikz{\path[clip] (0,0) rectangle (1,1); \draw (-0.25,0.25) -- (0.25,0.75)}

\end{document}

insira a descrição da imagem aqui

Responder1

Revisão. Este é um trecho que calcula as interseções com a caixa delimitadora e emite um aviso, se houver. (Claramente, se você tiver um caminho totalmente fora da caixa delimitadora, nenhum aviso será emitido.) Nesta versão, é necessário colocar \IssueWarningsno final da(s) imagem(s), e não tenho ideia do motivo execute at end picture={\IssueWarning}da falha. Qualquer informação sobre isso será muito apreciada.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\tikzset{x=1em,y=1em}
\newcounter{Paths}
\makeatletter% from https://tex.stackexchange.com/a/5354/121799
\tikzset{nomorepostaction/.code=\let\tikz@postactions\pgfutil@empty
\stepcounter{Paths}}
\newcommand\CheckIfPathExists[1]{
\pgfutil@ifundefined{tikz@intersect@path@name@#1}{\global\def\myPathExists{0}}{\global\def\myPathExists{1}}
}
\makeatother
\newcommand{\IssueWarnings}{\CheckIfPathExists{clip}
\ifnum\myPathExists=1
\xdef\CurrentPaths{\thePaths}
  \foreach \i in {2,...,\CurrentPaths}
  {\fill [name intersections={of=clip and path\i, name=i, total=\t}]
    %[red, opacity=0.5, every node/.style={above left, black, opacity=1}]
 \pgfextra{\xdef\Warn{\t}};
    }
    \ifnum\Warn>0\typeout{Warning: some paths got clipped}\fi
\else
\typeout{clip path not found}
\fi
}

\tikzset{
  clip warn/.style = {clip,name path=clip},
  every picture/.style={%
    execute at begin picture={\setcounter{Paths}{0}},
    execute at end picture={%
%   \IssueWarnings %<- doesn't work and I dunno why
    },
    },
 every path/.style={postaction={nomorepostaction,draw,
    name path=path\thePaths}}}
\begin{document}

This diagram should not produce a warning: 
  \tikz{\path[clip warn] (0,0) rectangle (1,1); 
  \draw (0.25,0.25) -- (0.25,0.75);
  \IssueWarnings
}

This diagram should produce a warning:%\typeout{checking second picture}
  \tikz{\path[clip warn] (0,0) rectangle (1,1); 
  \draw (-0.25,0.25) -- (0.25,0.75);
  \IssueWarnings
}

\end{document}

informação relacionada