Рассмотрим нижнюю часть этого MWE, а именно все, что находится ниже ( % Image Ruler y
):
\documentclass{article}
\usepackage{mwe} % Dummy images
\usepackage[skins]{tcolorbox}
\tcbuselibrary{raster}
\usepackage{tikz}
\usepackage{tikzpagenodes} % current page text area.center
\usetikzlibrary{calc}
\pgfkeys{/tikz/savevalue/.code 2 args={\global\edef#1{#2}}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\ShowHelps{0} % 1 'yes' 0 'no'
\newcommand{\UOneCoordinateX}{0.2}
\newcommand{\UOneCoordinateY}{0.09}
\newcommand{\UTwoCoordinateX}{0.2}
\newcommand{\UTwoCoordinateY}{0.284}
\newcommand{\GridSize}{0.05}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}[
remember picture, overlay, % page center 1/3
shift={(current page.center)}, % page center 2/3
font=\sffamily,
Help/.style={font=\Huge, red}
]
\node[anchor=center, %south west,
inner sep=0 pt] (myimage) at (0,0) {
\begin{tcbitemize}[size=tight, halign=center, colback=gray, raster equal skip=0pt, raster left skip=0mm, raster right skip=0mm, raster width=1\textwidth, boxrule = 0pt, frame hidden]
\tcbitem \includegraphics[width=\textwidth]{example-image.jpg}
\tcbitem \includegraphics[width=\textwidth]{example-image.jpg}
\end{tcbitemize}
};
\begin{scope}[x={($2*(myimage.east)$)},y={($2*(myimage.north)$)},
shift={(myimage.south west)} % page center 3/3
]
% Restrict the draw area
\clip (-0.1,-0.1) rectangle (1.1,1.1);
%%%%%ShowHelps
\path[] (\UOneCoordinateX,\UOneCoordinateY) coordinate(U1) -- (\UTwoCoordinateX,\UTwoCoordinateY) coordinate(U2);
\ifnum\ShowHelps=1 \draw[Help] (U1) circle(2pt) node[label=left:U1]{} -- (U2) circle(2pt) node[label=left:U2]{};\fi % show unitlength line
\path let \p1=($(U2)-(U1)$) in
\pgfextra{ \pgfmathsetlengthmacro{\unitlength}{veclen(\x1,\y1)} }
[savevalue={\u}{\unitlength}];
\ifnum\ShowHelps=1 \node[Help] at (0.725,0.25) {unitlength U1U2 = \u}; \fi%<--- show unitlength
\ifnum\ShowHelps=1 \draw[blue, transform canvas={xshift=2mm}] (U1) -- +(0,\u);\fi % Test
% Image Ruler y
\draw[very thick] (0,0) coordinate(B) -- (0, 1);
\foreach \n in {0,1,...,10}{%%
\draw[very thick] ([yshift=\n*\u]B) -- +(-3mm,0) node[left]{
\ifnum\n=0 \else \ifnum\n=1 \n\,cm \else \n \fi\fi};
}%%
\foreach \n in {0.1,0.2,...,10}{%%
\draw[] ([yshift=\n*\u]B) -- +(-1.5mm,0);
}%%
\end{scope}
\end{tikzpicture}
\end{document}
А именно:
\draw[very thick] (0,0) coordinate(B) -- (0, 1);
\foreach \n in {0,1,...,10}{%%
\draw[very thick] ([yshift=\n*\u]B) -- +(-3mm,0) node[left]{
\ifnum\n=0 \else \ifnum\n=1 \n\,cm \else \n \fi\fi};
}%%
\foreach \n in {0.1,0.2,...,10}{%%
\draw[] ([yshift=\n*\u]B) -- +(-1.5mm,0);
}%%
Функция 1
in \draw[very thick] (0,0) coordinate(B) -- (0, 1);
гарантирует, что толстая вертикальная линия линейки остановится на координате 1. Это здорово!
Однако как сделать так, чтобы маленькие линии останавливались на 1
, не меняя обрезку ( \clip (-0.1,-0.1) rectangle (1.1,1.1);
)?
Это можно сделать, изменив 10
in \foreach \n in {0.1,0.2,...,10}{%%
на 5, но это не то, к чему я стремлюсь, поскольку я не знаю заранее, сколько чисел мне понадобится. Все, что я знаю, это то, что я захочу остановиться на координате y 1
, точно так же, как толстая вертикальная линия останавливается при 1
использовании \draw[very thick] (0,0) coordinate(B) -- (0, 1);
.
Вот скриншот:
Итак, вкратце:
Мне нужен метод, позволяющий извлечь текущую координату y... Я не знаю, сколько раз мне придется циклически увеличивать сантиметры и миллиметры, все, что я знаю, это то, что он должен остановиться на 1.
решение1
Метод с использованиемdecoration
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations}
\usepackage{mwe}
\newcount\tick
\newcount\majortick
\newif\ifmajortick
\pgfdeclaredecoration{ruler}{initial}{
\state{initial}[
width=0mm, next state=ruler,
persistent precomputation={
\tick=10
\majortick=0
}
]{
}
\state{ruler}[width=1mm,
persistent precomputation={
\ifnum \tick=10\relax
\majorticktrue
\tick=0
\else
\majortickfalse
\fi
\advance\tick by 1
},
persistent postcomputation={
\ifnum \tick=10\relax
\advance\majortick by 1
\fi
}
]{
\ifmajortick
\pgfscope
\pgftransformrotate{-90}
\pgftransformshift{\pgfpoint{-4mm}{0pt}}
\pgfnode{rectangle}{east}{\the\majortick}{}{\pgfusepath{}}
\endpgfscope
\fi
\pgfpathmoveto{\pgfpointorigin}
\ifmajortick
\pgfsetlinewidth{1pt}
\pgfpathlineto{\pgfpoint{0pt}{3mm}}
\else
\pgfsetlinewidth{0.4pt}
\pgfpathlineto{\pgfpoint{0pt}{1mm}}
\fi
\pgfusepath{stroke}
}
\state{final}{}
}
\begin{document}
\begin{tikzpicture}
\node[inner sep=0pt] (a) {\includegraphics[width=.5\textwidth]{example-image}};
\draw[postaction=decorate, decoration=ruler] (a.south west) -- (a.north west);
\end{tikzpicture}
\end{document}
решение2
Я не думаю, что это вам действительно понадобится \clip (-0.1,-0.1) rectangle (1.1,1.1);
из-за работы с tcolorbox.
Но в качестве ответа на вопрос "Как обрезать ось Y":
Вам нужно знать, сколько точек составляет "1", высота изображения. И это измеряется точно так же, как измерялась "единица длины" в коде:
\path[draw=none] (0,0) coordinate(LL) -- (0,1) coordinate(UL);
\path let \p1=($(UL)-(LL)$) in
\pgfextra{ \pgfmathsetlengthmacro{\ImageHeight}{veclen(\x1,\y1)} }
[savevalue={\h}{\ImageHeight}];
\foreach \n in {0.1,0.2,...,10}{%%
\pgfmathsetmacro\Yshift{\n*\u}
\pgfmathsetmacro\YshiftTest{\n*\u < \h ? 1 : 0}
\ifnum\YshiftTest=1 \draw[] ([yshift=\Yshift]B) -- +(-1.5mm,0); \else\fi
}%%
\ifnum\ShowHelps=1
\draw[red] (LL) circle(2pt) node[below]{LL};
\draw[red] (UL) circle(2pt) node[above]{UL};
\node[right=3mm, Help] at (UL) {Image Height h=\h}; \fi
\documentclass{article}
\usepackage{mwe} % Dummy images
\usepackage[skins]{tcolorbox}
\tcbuselibrary{raster}
\usepackage{tikz}
\usepackage{tikzpagenodes} % current page text area.center
\usetikzlibrary{calc}
\pgfkeys{/tikz/savevalue/.code 2 args={\global\edef#1{#2}}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\ShowHelps{1} % 1 'yes' 0 'no'
\newcommand{\UOneCoordinateX}{0.2}
\newcommand{\UOneCoordinateY}{0.09}
\newcommand{\UTwoCoordinateX}{0.2}
\newcommand{\UTwoCoordinateY}{0.284}
\newcommand{\GridSize}{0.05}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}[
remember picture, overlay, % page center 1/3
shift={(current page.center)}, % page center 2/3
font=\sffamily,
Help/.style={font=\large, text=red, fill=yellow}
]
\node[anchor=center, %south west,
inner sep=0 pt] (myimage) at (0,0) {
\begin{tcbitemize}[size=tight, halign=center, colback=gray, raster equal skip=0pt, raster left skip=0mm, raster right skip=0mm, raster width=1\textwidth, boxrule = 0pt, frame hidden]
\tcbitem \includegraphics[width=\textwidth]{example-image.jpg}
\tcbitem \includegraphics[width=\textwidth]{example-image.jpg}
\end{tcbitemize}
};
\begin{scope}[x={($2*(myimage.east)$)},y={($2*(myimage.north)$)},
shift={(myimage.south west)} % page center 3/3
]
% Restrict the draw area
\clip (-0.1,-0.1) rectangle (1.1,1.1);
\ifnum\ShowHelps=1 \draw[red] (-0.1,-0.1) rectangle (1.1,1.1);\fi
%%%%%ShowHelps
\path[] (\UOneCoordinateX,\UOneCoordinateY) coordinate(U1) -- (\UTwoCoordinateX,\UTwoCoordinateY) coordinate(U2);
\ifnum\ShowHelps=1 \draw[red] (U1) circle(2pt) node[label=left:U1]{} -- (U2) circle(2pt) node[label=left:U2]{};\fi % show unitlength line
\path let \p1=($(U2)-(U1)$) in
\pgfextra{ \pgfmathsetlengthmacro{\unitlength}{veclen(\x1,\y1)} }
[savevalue={\u}{\unitlength}];
\ifnum\ShowHelps=1 \node[Help] at (0.3,0.5) {unitlength U1U2 = \u}; \fi%<--- show unitlength
\ifnum\ShowHelps=1 \draw[blue, transform canvas={xshift=2mm}] (U1) -- +(0,\u);\fi % Test
% Image Ruler y
\draw[very thick] (0,0) coordinate(B) -- (0, 1);
\foreach \n in {0,1,...,10}{%%
\draw[very thick] ([yshift=\n*\u]B) -- +(-3mm,0) node[left]{
\ifnum\n=0 \else \ifnum\n=1 \n\,cm \else \n \fi\fi};
}%%
\path[draw=none] (0,0) coordinate(LL) -- (0,1) coordinate(UL);
\path let \p1=($(UL)-(LL)$) in
\pgfextra{ \pgfmathsetlengthmacro{\ImageHeight}{veclen(\x1,\y1)} }
[savevalue={\h}{\ImageHeight}];
\foreach \n in {0.1,0.2,...,10}{%%
\pgfmathsetmacro\Yshift{\n*\u}
\pgfmathsetmacro\YshiftTest{\n*\u < \h ? 1 : 0}
\ifnum\YshiftTest=1 \draw[] ([yshift=\Yshift]B) -- +(-1.5mm,0); \else\fi
}%%
\ifnum\ShowHelps=1
\draw[red] (LL) circle(2pt) node[below]{LL};
\draw[red] (UL) circle(2pt) node[above]{UL};
\node[right=3mm, Help] at (UL) {Image Height h=\h}; \fi
\end{scope}
\end{tikzpicture}
\end{document}