
Я определил две переменные
\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\mynumberone
then, либо с помощью \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
.
Кстати, один из недостатков использования \def
as 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 непосредственно как запись матрицы узлов.
Спасибо