在此 MWE 中,我希望能够使用有理分数 $\frac{1}{9}$ 和 $\frac{2}{9}$ 作为 x 轴刻度标记的标签。如何修改以下内容来实现此目的?
(在实际应用中,会有更长的刻度标记及其标签列表,因此我想“自动化”这一点。)
\documentclass[tikz,border=0.25mm]{standalone}
\usepackage{amsfonts}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}[line join=round,scale=3.5]
\draw[->, thin]
(-0.1,0) -- (1.1,0) node[anchor=west, inner sep=2pt] {$x$};
\foreach \i in {1/9,2/9,1/3,2/3,7/9,8/9} {
\draw (\i,-.01)--(\i,.01);
};
\foreach \x/\y in {{1,9},{2,9}}{
\node[anchor=north] at (\the\numexpr \x /\y,0) {$\tfrac{\x}{\y}$};
};
\end{tikzpicture}
\end{document}
这涉及两个问题:
- 正确获取“对的特殊处理”的语法(prfmanual.pdf 中的第 1002 页;以及
- 对于给定的一对——要作为刻度标签打印的精确有理分数的分子和分母,如何从它们形成给出节点水平坐标的数值表达式。
请注意我不能只需使用类似
\foreach \xy in {1/9,2/9}{
\node[anchor=north] at (\xy,0) {$\xy$}
};
因为那没有使用 来格式化分数\tfrac
。
进一步说明:如果可能的话,我希望能够使用 TikZ/pgf\foreach
构造来迭代对列表;并且我非常希望不是使用任何 exp3 构造,因为我发现 exp3 语法比 TikZ 语法更难以理解!
答案1
抱歉,我不太明白的扩展顺序\foreach
,只需使用\clist_map_inline:nn
:
\documentclass[tikz,border=0.25mm]{standalone}
\usepackage{amsfonts}
\usepackage{amsmath}
\ExplSyntaxOn
\cs_set:Npn \frac:n#1{
\tl_set:Nn \l_tmpa_tl{#1}
\regex_replace_all:nnN{(\d+)\/(\d+)}{\c{tfrac}\cB\{\1\cE\}\cB\{\2\cE\}}\l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\cs_set_eq:NN \mfrac \frac:n
\ExplSyntaxOff
\begin{document}
\ExplSyntaxOn
\begin{tikzpicture}[line~join=round,scale=3.5]
\draw[->, thin] (-0.1,0) -- (2,0) node[anchor=west, inner~sep=2pt] {$x$};
\clist_map_inline:nn{1/9,2/9,3/9,4/9,5/9,6/9,12/9}
{
\draw (#1,-.01) -- (#1,.01);
\node[below,scale=0.5] at (#1,0) {$\mfrac{#1}$};
}
\end{tikzpicture}
\ExplSyntaxOff
\end{document}
抱歉我让事情变得复杂了
\documentclass[tikz,border=0.25mm]{standalone}
\usepackage{amsfonts}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}[line join=round,scale=3.5]
\draw[->, thin] (-0.1,0) -- (2,0) node[anchor=west, inner sep=2pt] {$x$};
\foreach \x/\y in {1/9,2/9,3/9,4/9,5/9,6/9,12/9}
{
\draw[red] (\x/\y,-.01) -- +(0,.02);
\node[cyan,scale=0.5,below] at (\x/\y,0){$\tfrac{\x}{\y}$};
}
\end{tikzpicture}
\end{document}
另一种解决方案,但不太完善:
\documentclass[tikz,border=0.25mm]{standalone}
\usepackage{amsfonts}
\usepackage{amsmath}
\def\mfrac#1/#2{$\tfrac{#1}{#2}$} % \mfrac#1/#2 --> \tfrac{#1}{#2}
\begin{document}
\begin{tikzpicture}[line join=round,scale=3.5]
\draw[->, thin] (-0.1,0) -- (2,0) node[anchor=west, inner sep=2pt] {$x$};
\foreach \x in {1/9,2/9,3/9,4/9,5/9,6/9,12/9,18/12}
{
\draw (\x,-.01) -- (\x,.01);
\node[below,scale=0.5] at (\x,0) {\expandafter\mfrac\x};
}
\end{tikzpicture}
\end{document}
我觉得更完美的是:
\documentclass[tikz,border=0.25mm]{standalone}
\usepackage{amsfonts}
\usepackage{amsmath}
%define the command \mfrac =========== \mfrac{#1/#2} --> \tfrac{#1}{#2}
\ExplSyntaxOn
\cs_set:Npn \frac:n#1{
\tl_set:Nn \l_tmpa_tl{#1}
\regex_replace_all:nnN{(\d+)\/(\d+)}{$\c{tfrac}\cB\{\1\cE\}\cB\{\2\cE\}$}\l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\cs_set_eq:NN \mfrac \frac:n
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}[line join=round,scale=3.5]
\draw[->, thin] (-0.1,0) -- (2,0) node[anchor=west, inner sep=2pt] {$x$};
\foreach \x in {1/9,2/9,3/9,4/9,5/9,6/9,12/9,18/12}
{
\draw (\x,-.01) -- (\x,.01);
\node[below,scale=0.5] at (\x,0) {\expandafter\mfrac\expandafter{\x}};
}
\end{tikzpicture}
\end{document}
答案2
一些解释。希望这能解决你的误解(如果有的话)。
- 最清洁的解决方案包含在其他答案, 写吧
\x/\y
。
\foreach \x/\y in {1/9,2/9,3/9,4/9,5/9,6/9,12/9}
{
\draw[red] (\x/\y,-.01) -- +(0,.02);
\node[cyan,scale=0.5,below] at (\x/\y,0){$\tfrac{\x}{\y}$};
}
- 这里请注意,上面的代码和前面的答案的语法都是传递(完全扩展为)字面上地
1/9
进入 TikZ。此代码将起作用
\begin{tikzpicture}
\node at (1/9, 0) {abc};
\end{tikzpicture}
- 在代码中上一个答案...
\foreach \i in {1/9,2/8,1/3,2/3,7/9,8/9} {
\show \i
\draw (\i,-.01)--(\i,.01);
\node[anchor=west, rotate=-75, font=\tiny] at (\i,0) {$\small{\i}$};
}
的值\i
直接赋值为字符串1/9
,而不是值例如0.111
或某些魔法。我添加了\show \i
演示,您将在终端上看到
> \i=macro:
->1/9.
- 使用
\numexpr
类似下面的代码...
\begin{tikzpicture}
\node at (\the\numexpr 1/9\relax, 0) {abc};
\end{tikzpicture}
不会按预期工作。阅读texdoc etex_man
,您会看到除法“四舍五入到最接近的整数”,因此它变为 0。
答案3
试试这个代码:
\documentclass[tikz,border=2.5mm]{standalone}
\begin{document}
\begin{tikzpicture}[line join=round,scale=4.5]
\draw (0,.01)--(0,-.01) node[below] {\tiny 0};
\draw[thick,black,-latex] (-.1,0) -- (1.1,0) node[right] {$x$};
\foreach \i/\n in {{1/9}/$\frac19$,{2/9}/$\frac29$,{1/3}/$\frac13$,{2/3}/$\frac23$,{7/9}/$\frac79$,{8/9}/$\frac89$}{%
\draw (\i,.01)--(\i,-.01) node[below] {\tiny \n};
}
\end{tikzpicture}
\end{document}
输出:
评论:思考一下此代码:
\documentclass[tikz,border=0.25mm]{standalone}
\begin{document}
\begin{center}
\begin{tabular}{cccc}
$x^2/9$ & $ x^{2/9}$ & $x^a/b$ & $x^{a/b}$ \\
$\frac{1}{9}$ & $\frac29$ & $\frac{a}{b}$ & $\frac ab$
\end{tabular}
\end{center}
\end{document}
结果如下: