使用 TikZ 在刻度线处使用精确分数

使用 TikZ 在刻度线处使用精确分数

在此 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}

这涉及两个问题:

  1. 正确获取“对的特殊处理”的语法(prfmanual.pdf 中的第 1002 页;以及
  2. 对于给定的一对——要作为刻度标签打印的精确有理分数的分子和分母,如何从它们形成给出节点水平坐标的数值表达式。

请注意我不能只需使用类似

\foreach \xy in {1/9,2/9}{
    \node[anchor=north] at (\xy,0) {$\xy$}
};

因为那没有使用 来格式化分数\tfrac

进一步说明:如果可能的话,我希望能够使用 TikZ/pgf\foreach构造来迭代对列表;并且我非常希望不是使用任何 exp3 构造,因为我发现 exp3 语法比 TikZ 语法更难以理解!

有关的: 为什么刻度标签都位于 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}

结果如下:

在此处输入图片描述

相关内容