![如何定义在 tikz 图片中绘制轴标签的宏?](https://linux22.com/image/259021/%E5%A6%82%E4%BD%95%E5%AE%9A%E4%B9%89%E5%9C%A8%20tikz%20%E5%9B%BE%E7%89%87%E4%B8%AD%E7%BB%98%E5%88%B6%E8%BD%B4%E6%A0%87%E7%AD%BE%E7%9A%84%E5%AE%8F%EF%BC%9F.png)
我想绘制一个宏来排版轴刻度标记和标签。但是,以下
\newcommand\obrPopisX[2][below]{\foreach \x/\xtext in {#2}
\draw[shift={(\x,0)}] (0pt,2pt) -- (0pt,-2pt) node[#1] {$\xtext$};}
无法产生良好的结果,因为可选参数是“above”——标签太近了,因为它们附着在轴下方 2pt 的点上。作为部分解决方法,我可以使用
\newcommand\obrPopisX[2][below]{\foreach \x/\xtext in {#2}
{\draw[shift={(\x,0)}] (0pt,2pt) -- (0pt,-2pt);
\draw [shift={(\x,0)}] (0,0) node[#1] {$\xtext$};};}
但这会将标签设置为相对于轴上的点,而不是刻度标记的末尾。我希望定义宏,将标签设置为相对于整条线,即行为如下
\draw[shift={(0,\y)}] (2pt,0pt) -- (-2pt,0pt) node ...;
或者类似
\draw[shift={(0,\y)}] (-2pt,0pt) -- (2pt,0pt) node ....;
取决于关键字“above”是否是宏 obrPopisX 的可选参数之一。有什么想法吗?可能我想将标签附加到整条线上,而不是线的终点。谢谢。
答案1
以下是定义CoordinateAxisX
接受参数的宏的一种方法:
[<label-style>]
= 应用于刻度标签的样式{<x-axis-label>}
= x 轴标签{XAxisMin}
= xmin 用于绘制轴{XAxisMax}
= xmax 用于绘制轴{tick marks}
= 勾选位置列表
第一个是默认设置,第二个是[above,red]
指定的选项,第三个是[below,blue]
指定的选项:
进一步增强:
- 请注意,这要求选项周围没有空格
above
。因此,将其与..., above,...
、 或 一起使用...,above ,...
将失败。这可以通过进一步使用该包轻松解决xstring
,但由于似乎不想使用其他包,因此我没有添加该增强功能。 - 这种方法也不是考虑到
below
可以通过 指定选项的可能性above,below
。在这种情况下,该above
选项将应用于轴标签,尽管就目前而言pgfkeys
,该below
选项是活动的选项。
代码:
\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}
\newcommand*{\IfIsInString}[4]{%
\StrPosition{#1}{#2}[\Position]%
\IfEq{\Position}{0}{#4}{#3}%
}%
\newcommand*{\TickSize}{2pt}%
\newcommand*{\CoordinateAxisX}[5][]{%
% [<label-style>]{<x-axis-label>}{XAxisMin}{XAxisMax}{tick marks}
\edef\TickMarks{#5}
\draw [gray, thin, -latex] (#3,0) -- (#4,0) node[right] {#2};%
\IfIsInString{,#1,}{,above,}{%
\foreach \x in \TickMarks {%
\draw [gray, thin] (\x, -\TickSize) -- (\x,\TickSize)
node [above, black, #1] {$\x$};
}%
}{%
\foreach \x in \TickMarks {%
\draw [gray, thin] (\x, \TickSize) -- (\x,-\TickSize)
node [below, black, #1] {$\x$};
}%
}%
}%
\newcommand*{\XMin}{-3}%
\newcommand*{\XMax}{3}%
\newcommand*{\XAxisLabel}{$x$}
\begin{document}
\begin{tikzpicture}
\CoordinateAxisX{\XAxisLabel}{\XMin}{\XMax}{-2,...,2}
\end{tikzpicture}
\bigskip
\begin{tikzpicture}
\CoordinateAxisX[above,red]{\XAxisLabel}{\XMin}{\XMax}{-2,...,2}
\end{tikzpicture}
\bigskip
\begin{tikzpicture}
\CoordinateAxisX[below,blue]{\XAxisLabel}{\XMin}{\XMax}{-2,...,2}
\end{tikzpicture}
\end{document}