
У меня есть список списков, и я использую вложенные \foreach
циклы для их итерации. Используя [count=\var]
, я могу использовать \var
для доступа к длине внешнего цикла (после того, как я выполнил итерацию). Однако я не могу использовать этот метод для доступа к длине внутренних циклов. В моем случае все внутренние циклы должны иметь одинаковую длину, но технически я хотел получить доступ к длине последнего из внутренних циклов. Вот что у меня есть на данный момент:
\documentclass{article}
\usepackage{tikz}
\begin{document}
% The first two work:
\begin{tikzpicture}
\foreach \from [count=\to] in {2,3,1} {
\draw (\from,1) -- (\to,2);
}
\draw[gray] (0.5,0.5) rectangle (\to+0.5,2.5);
\end{tikzpicture}
\begin{tikzpicture}
\foreach \from [count=\to] in {1,3,2} {
\draw (\from,1) -- (\to,2);
}
\draw[gray] (0.5,0.5) rectangle (\to+0.5,2.5);
\end{tikzpicture}
% This one does not work:
\begin{tikzpicture}
\foreach \list [count=\row] in {{2,3,1},{1,3,2}} {
\foreach \from [count=\to] in \list {
\draw (\from,\row) -- (\to,\row+1);
}
}
\draw[gray] (0.5,0.5) rectangle (\to+0.5,\row+1.5);
\end{tikzpicture}
\end{document}
Вот что я хочу получить в итоге:
решение1
Это использует счетчики LaTeX в сочетании с макросами TikZ. Все операции со счетчиками являются глобальными.
\documentclass{article}
\usepackage{tikz}
\newcounter{to}
\newcounter{row}
\begin{document}
\begin{tikzpicture}
\setcounter{to}{0}
\foreach \from in {2,3,1} {
\stepcounter{to}
\draw (\from,1) -- ({\theto},2);
}
\draw[gray] (0.5,0.5) rectangle (\theto+0.5,2.5);
\end{tikzpicture}
\begin{tikzpicture}
\setcounter{to}{0}
\foreach \from in {1,3,2} {
\stepcounter{to}
\draw (\from,1) -- (\theto,2);
}
\draw[gray] (0.5,0.5) rectangle (\theto+0.5,2.5);
\end{tikzpicture}
\begin{tikzpicture}
\setcounter{row}{0}
\foreach \list in {{2,3,1},{1,3,2}} {
\stepcounter{row}
\setcounter{to}{0}
\foreach \from in \list {
\stepcounter{to}
\draw (\from,\therow) -- (\theto,\therow+1);
}
}
\draw[gray] (0.5,0.5) rectangle (\theto+0.5,\therow+1.5);
\end{tikzpicture}
\end{document}
решение2
Недостатком этого решения является необходимость многократного перебора списка, но при этом не требуется устанавливать глобальную переменную.
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \list [count=\row] in {{2,3,1},{1,3,2}} {
\foreach \from [count=\to] in \list {
\draw (\from,\row) -- (\to,\row+1);
}
}
\foreach \list [count=\count] in {{2,3,1},{1,3,2}} {
\ifx \count \row
\foreach \from [count=\to] in \list {
}
\draw[gray] (0.5,0.5) rectangle (\to+0.5,\row+1.5);
\fi
}
\end{tikzpicture}
\end{document}
Проблема моей первой версии в том, что она \to
была вне области действия, когда я пытался ее использовать. Эта версия использует ее, когда она все еще в области действия.