
Как следует из заголовка, я хотел бы узнать, возможно ли выдать предупреждение LaTeX, если что-то было обрезано в tikzpicture
. И если да, то как мне этого добиться?
Мой вариант использования заключается в том, что я работаю над небольшим набором макросов для создания рисунков и хочу получать предупреждение, если я нарисовал что-либо за пределами определенной области рисования. Я использую обрезку в рисунке, чтобы предотвратить рисование чего-либо за пределами области. Это предотвращает искажение макета страницы, но пользователь не имеет ни малейшего представления о том, что что-то на самом деле не было помещено на страницу (кроме ручного просмотра вывода). Было бы неплохо предупреждать пользователя в моем конкретном варианте использования.
В идеале это предупреждение можно было бы включить, назначив стиль, например clip warn
, среде scope
или самому клипу \path
.
Ниже приведен пример MWE для отправной точки и в целях тестирования:
\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}
решение1
Пересмотр. Это фрагмент, который вычисляет пересечения с ограничивающим прямоугольником и выдает предупреждение, если таковое имеется. (Очевидно, что если у вас есть путь, который полностью находится за пределами ограничивающего прямоугольника, предупреждение не будет выдано.) В этой версии one необходимо разместить \IssueWarnings
в конце изображения(ий), и я понятия не имею, почему execute at end picture={\IssueWarning}
это не получается. Любая информация по этому поводу будет высоко оценена.
\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}