Tikz и переменные

Tikz и переменные

Я определил две переменные

\def\aa{3}  \def\bb{1}

\def\qq{\multiply\aa by \bb}

но когда я пытаюсь использовать \qqкоманду \matrixтипа

\matrix[matrix of math nodes]{12 & \qq\\};

ktikz говорит:

temptikzcode.pgf:60 You can't use `the character 3'

Что я делаю не так?

Я подозреваю, что существует некая проблема с переменной, но я не смог решить ее с помощью \print{\qq}или \string\qq.

Спасибо

решение1

A \def\aa{3}не выделяет регистр счетчика. \multiplyтребует регистр счетчика («целочисленная переменная»).

Используйте либо countрегистры, либо \the\numexpr \aa *\bb, последний вариант работает только для целых чисел, тогда как его \multiplyможно использовать и для числовых переменных.

В примере используются оба варианта.

\multiply\mynumberone by \mynumbertwoперемножит содержимое обоих регистров счетчиков и сохранит результат в \mynumberone, который должен быть распечатан либо с помощью \the\mynumberonethen, либо с помощью \number\value{mynumberone}.

Подход с \numexpr- проще, но требует e-TeX, но в наши дни это не должно быть проблемой.

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}


\def\aa{3}  \def\bb{1}

\newcount\mynumberone
\newcount\mynumbertwo

\mynumberone=3
\mynumbertwo=2

\def\qq{\the\numexpr\aa * \bb\relax}

\def\ww{\multiply\mynumberone by \mynumbertwo}


\begin{tikzpicture}
  \matrix[matrix of math nodes]{12 & \qq\\ 15 & \ww\the\mynumberone\\};
\end{tikzpicture}

\end{document}

введите описание изображения здесь

решение2

Рабочим методом было бы использовать \pgfmathtruncatemacroвместо \multiply. Это вычислит результат и отбросит десятичные дроби. Если вам нужны десятичные дроби, вы можете использовать \pgfmathsetmacro.

Кстати, один из недостатков использования \defas contrast to \newcommandзаключается в том, что он не скажет вам, переопределяете ли вы существующий макрос. В данном случае \aa— это макрос для печати «å». В общем, переопределение существующих макросов — не очень хорошая практика, если только вы, цитируя cfr, «абсолютно не уверены, что знаете, что делаете и почему».

К сожалению, \pgfmathtruncatemacroи \pgfmathsetmacroпроверку на наличие макроса тоже не делаем.

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
%\newcommand\aa{3}  % causes error, command \aa already defined
\newcommand\aaa{3} 
\newcommand\bb{1}
\pgfmathtruncatemacro{\qq}{\aaa*\bb}
\usetikzlibrary{matrix}
\begin{document} 
\begin{tikzpicture}
\matrix[matrix of math nodes]{12 & \qq\\};
\end{tikzpicture}
\end{document} 

решение3

Это просто для комментария, что моя первоначальная проблема заключалась в том, чтобы поместить две матрицы и выполнить продукт тремя разными способами, чтобы сгенерировать последовательность для создания видео для моих студентов. Фоны узлов и стрелки использовались интенсивно.

Я думаю, что я решаю другую проблему, которая, возможно, кого-то заинтересует:поместить все элементы матрицы вправо. (как\begin{array}{rrr}... )

\pgfmathtruncatemacro{\qc}{\ha*\bc} \def\qct{{\color{c1}\ifthenelse{\qc<0}{\qc}{\D\qc}}}

где \qc и \ha — вычисляемые переменные, \bc — элемент B(1,3) моей второй матрицы (не представляю, почему Tikz не принимает \b13 в качестве переменной), \qct — текстовая версия \qc: если неотрицательно, то мы ставим \D = \phantom{-}.

Менее сложным было бы определить команду для вычисления \qct непосредственно как запись матрицы узлов.

Спасибо

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