我已经定义了两个变量
\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
而不是 的一个缺点\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 作为节点矩阵的条目。
谢谢