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 scope
ambiente 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}
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 \IssueWarnings
no 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}