Нетривиальное использование tikz foreach со списком координат

Нетривиальное использование tikz foreach со списком координат

Я изо всех сил пытаюсь заставить работать следующий код:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}

\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
    \begin{scope}[shift={\point}]
        \fill (0,0) circle (0.1) ;
    \end{scope}
}

\end{tikzpicture}

\end{document}

Журнал содержит

Ошибка пакета tikz: Невозможно проанализировать эту координату.

См. документацию пакета tikz для получения объяснений. Введите H для немедленной помощи. ...
l.11 } Это сообщение об ошибке было сгенерировано командой \errmessage, поэтому я не могу дать никакой явной помощи. Представьте, что вы Эркюль Пуаро: изучите все улики и выведите истину по порядку и методу.

Отсутствует символ: В шрифте nullfont нет символа (!

Отсутствует символ: В шрифте nullfont нет символа 0!

Отсутствует символ: В шрифте nullfont нет символа ,

Отсутствует символ: В шрифте nullfont нет символа 0!

Отсутствует символ: В шрифте nullfont нет символа )!

Есть ли способ использовать эти координаты напрямую или мне следует прибегнуть к стилю X/Y?

Обновление: (в ответ на утверждение, что () решает проблему). Я полностью обновил установку Miktex через консоль. Однако следующие строки (напрямую связанные с использованием shift + ()) все еще появляются:

Файл: epstopdf-sys.cfg 2021/03/18 v2.0 Конфигурация epstopdf для MiKTeX ))

Отсутствует символ: В шрифте nullfont нет символа )!

Отсутствует символ: В шрифте nullfont нет символа )!

Отсутствует символ: В шрифте nullfont нет символа )!

Отсутствует символ: В шрифте nullfont нет символа )!

[1]

Ровно одна скобка для каждой координаты в списке (проверяется с разным количеством точек).

решение1

Когда анализатор TikZ (который также используется для анализа shiftкоординат) находит что-то непонятное, он обычно пытается расширить то, что находится перед ним.

Вот почему

\fill \point circle (0.1);

работает без сбоев.

На случай, если пользователь напишет неправильный синтаксис, у TikZ есть защита от сбоев, поскольку он уменьшает внутренний счетчик и пробует тактику расширения только до тех пор, пока этот счетчик не достигнет 0. Этот счетчик обычно начинается со 100 и уменьшается на 1 или 10 в зависимости от случая.

В определенных местах этот счетчик сбрасывается до 100, например, в начале пути (вот почему

\fill[shift=\point] (0,0) circle (0.1) ;

работает) или когда парсер успешно находит допустимую спецификацию пути. Этоне сбрасываетсяв начале картинки или в начале области видимости. И поскольку в этой точке он все еще является значением по умолчанию и инициализирован 0, то парсинг выдает ошибку.

Использование shift=(\point)работает, потому что есть еще одно расширение всего происходящего, но это приведет к предупреждениям

Missing character: There is no ) in font nullfont!

Это потому, что теперь он пытается проанализировать

((0,0))
и происходит то, что анализатор распознает (0какИксзначение для координаты и второе 0какузначение. Но он оставляет самое последнее )во входном потоке TeX, подобно тому, как если бы вы сделали:

\path;
Foo
\path;

Теперь, почему не (0возникает никаких ошибок? Как и многое в PGF/TikZ, это будет передано в PGFmath и оценено… и у PGFmath с этим нет проблем. Попробуйте

\pgfmathparse{(((((1}\pgfmathresult

или даже

\pgfmathparse{1))))}\pgfmathresult

Вместо использования \expandedи , \noexpandкак предлагается в комментариях, я бы рекомендовал использовать.expandedобработчик ключейчто даст команду PGFkeys расширить значение перед передачей его ключу.

(Или мы патчим либо scopeсреду, либо shiftключ, либо просто вручную сбрасываем счетчик, но использование обработчика ключей всегда работает очень хорошо в других местах, когда TikZ не выполняет никаких расширений самостоятельно.)

Код

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
  \begin{scope}[shift/.expanded=\point]
    \fill (0,0) circle[radius=.1];
  \end{scope}
}
\end{tikzpicture}
\end{document}

Связанный контент