У меня нет опыта работы с LaTeX/TikZ
, поэтому я могу делать что-то глупое.
У меня есть две версии этого кода. Одна работает, другая нет, и я в растерянности, пытаясь понять, почему вторая не работает.
Сначала версия, которая работает:
\documentclass[parskip]{scrartcl}
\usepackage[left=1cm, right = 3cm, top = 1cm, bottom = 1cm]{geometry}
\usepackage{tikz}
\usepackage{pifont}
\usepackage{xifthen}
\usepackage[utf8]{inputenc}
\usepackage{forloop}
\usepackage[nomessages]{fp}
\usetikzlibrary{shapes}
\usetikzlibrary{calc}
\newcommand\sz{1.5cm}
%usage: size guid
\newcommand\hexboard[2]{
\begin{tikzpicture} [hexa/.style= {shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture]
\newcommand\sep{x}
\pgfmathsetmacro\minCoord{int(-1*#1)}
\foreach \j in {\minCoord,...,#1}{%
\foreach \i in {\minCoord,...,#1}{%
\ifthenelse{\cnttest{ \minCoord }{<}{ \i*\j }}{\node[hexa] (#2_h\i\sep\j) at ({(\i*.75*\sz)},{\j*\sz*sqrt(3)/2 - \i*\sz*sqrt(3)/4}) {\i\sep\j};}{}
}
}
\end{tikzpicture}
}
%usage: {{x1,y1}...} color opacity guid
\newcommand\targetedHexes[4]{
\begin{tikzpicture} [hexa/.style= {fill opacity = #3, shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture, overlay]
\foreach [count=\x] \pt in {#1} {
\node [hexa, fill = #2] (target\x) at (#4_h\pt) {};
}
\end{tikzpicture}
}
%usage: guid
\newcommand\drawSelf[1]{
\begin{tikzpicture} [hexa/.style= {fill opacity = .5, shape=regular polygon,regular polygon sides=6,minimum size=\sz, draw,inner sep=0,anchor=center,fill=lightgray!85!blue,rotate=0}, remember picture, overlay]
\node [hexa, color = blue] (self) at (#1_h0x0){};
\end{tikzpicture}
}
\newcommand\areaEffect[2]{
\hexboard{#1}{hello}
\targetedHexes{#2}{red}{0.5}{hello}
\drawSelf{hello}
}
\begin{document}
\areaEffect{2}{{0x1},{0x2},{1x0}}
\end{document}
По сути, он рисует сетку шестиугольников, а затем перезаписывает определенные шестиугольники (передаваемые как список координат) другим цветом.
Я хотел бы иметь возможность указать несколько групп, каждая из которых получит свой color
/ opacity
. Однако изменение выше для замены последних 10 строк не работает:
\newcommand\areaEffect[2]{
\hexboard{#1}{hello}
\foreach [count=\s] \section in {#2}{
\targetedHexes{\section}{red}{0.15*\s}{hello}
}
\drawSelf{hello}
}
\begin{document}
\areaEffect{2}{{{0x1},{0x2}},{{1x0}}}
\end{document}
В частности, в старой версии in \targetedHexes
, in (target\x)
at (#4_h\pt)
оценивается \pt
как 0x1
или 0x2
. В новой версии он оценивается как {0x1}
или {0x2}
.
Думаю, у меня возникнут следующие вопросы:
Что здесь происходит? Почему они разные? Разве они не должны быть более или менее эквивалентны?
Как исправить вторую версию?
Спасибо за ваше время!
решение1
В первой версии \targetedHexes
вызывается {0x1},{0x2},{1x0}
с первым аргументом, путем обычной замены параметров.
Во второй версии \targetedHexes
вызывается \section
с первым аргументом; в этой точке не происходит никакого расширения. Теперь от последующего кода зависит, \section
расширяется ли он со временем; что, по-видимому, не происходит.
Похоже, что расширение \section
перед коллированием targetedHexes
дает нужный эффект.
\newcommand\areaEffect[2]{
\hexboard{#1}{hello}
\foreach [count=\s] \section in {#2}{
\expandafter\targetedHexes\expandafter{\section}{red}{0.15*\s}{hello}
}
\drawSelf{hello}
}