例子

例子

我怎样用 tex 绘制这样的图画?

我不确定缩放比例。我相信它可以是任意的。即,只要的长度$\ell_j$小于$\ell_i$$\forall \, j>i$

在此处输入图片描述

任何帮助,将不胜感激。

答案1

使用 TikZ\foreach循环,它只有三行。要控制衰减,请更改部分

... -- (\x,-10/\x);

根据你的喜好,例如

... -- (\x,{-5/sqrt(\x)});

例子

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
    \foreach \x in {1,...,11} {
        \draw[|-|] (\x,0) node[above] {$\ell_{\x}$} -- (\x,-10/\x);
    }
    \node at (12,-10/12/2) {$\cdots$};
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案2

无需 即可完成tikz。将标签和空格分隔的实数列表传递给\graphmydata。可配置参数包括与数据相关的单位长度(比例)(\graphunits)、规则厚度(\rlwd)、项目之间的水平间隙(\myhgap)和刻度长度(\ticklength)。

\documentclass{article}
\usepackage[usestackEOL]{stackengine}
\usepackage{readarray}
\usepackage{ifthen}
\def\rlwd{.4pt}
\def\myhgap{1.5em}
\def\ticklength{.5ex}
\newlength\graphunits
\graphunits 1cm
\def\tick{\rule{\ticklength}{\rlwd}}

\newcommand\dline[1]{%
  \setstackgap{S}{0pt}\Shortunderstack{\tick\\\rule[-#1]{\rlwd}{#1} \\\tick}}

\newcommand\mygraph[2]{%
  \stackunder[3pt]{\hsmash{#1}}{\dline{#2\graphunits}}\hspace{\myhgap}\ignorespaces}

\newcounter{index}
\def\graphmydata#1#2{%
  \readArrayij{#2}{datablock}{1}%
  \setcounter{index}{0}%
  \whiledo{\theindex<\datablockCELLS}{%
    \stepcounter{index}%
    \mygraph{$#1_{\theindex}$}{\arrayij{datablock}{\theindex}{1}}%
  }%
  \raisebox{-\baselineskip+5pt}{$\cdots$}%
}
\begin{document}
\graphmydata{l}{3 1.5 0.75 0.375 0.1875 0.09375}
\end{document}

在此处输入图片描述

因此,将参数更改为

\def\rlwd{.8pt}
\def\myhgap{1.6em}
\def\ticklength{.8ex}
\graphunits 0.02cm
\graphmydata{p}{103.4 52.2 26.6 13.8 7.4 4.2 2.6 1.8 1.4 1.2 1}

产量

在此处输入图片描述


编辑:对于那些希望从文件而不是从导入数据的人来说\def,该readarray包可以从文件导入数据。以下是该版本:

\documentclass{article}
\usepackage[usestackEOL]{stackengine}
\usepackage{readarray}
\usepackage{ifthen}
\usepackage{filecontents}
\def\rlwd{.4pt}
\def\myhgap{1.5em}
\def\ticklength{.5ex}
\newlength\graphunits
\graphunits 1cm
\def\tick{\rule{\ticklength}{\rlwd}}

\newcommand\dline[1]{%
  \setstackgap{S}{0pt}\Shortunderstack{\tick\\\rule[-#1]{\rlwd}{#1} \\\tick}}

\newcommand\mygraph[2]{%
  \stackunder[3pt]{\hsmash{#1}}{\dline{#2\graphunits}}\hspace{\myhgap}\ignorespaces}

\newcounter{index}
\def\graphmydatafile#1#2{%
  \readdef{#2}{\mydata}%
  \readArrayij{\mydata}{datablock}{1}%
  \setcounter{index}{0}%
  \whiledo{\theindex<\datablockCELLS}{%
    \stepcounter{index}%
    \mygraph{$#1_{\theindex}$}{\arrayij{datablock}{\theindex}{1}}%
  }%
  \raisebox{-\baselineskip+5pt}{$\cdots$}%
}

\begin{filecontents}{mydatafile.dat}
3
1.5
0.75
0.375
0.1875
0.09375%
\end{filecontents}

\begin{document}
\graphmydatafile{l}{mydatafile.dat}
\end{document}

答案3

使用 MetaPost 完成,并将gmp包作为界面(在激活 shell-escape 选项的情况下运行)。

行数明显比 的多tikz,主要是因为我必须自己定义一个宏来绘制线段,并在其末端添加垂直标记,因为 MetaPost 没有内置宏。不过这也没什么大不了的。无论如何,MetaPost 本质上比其相关 (La)TeX 包更冗长tikz,但幸运的是,在需要时使用它来定义辅助宏很容易(至少我觉得如此))。pstricksmfpic

\documentclass[12pt]{article}
\usepackage[latex, shellescape]{gmp}
\gmpoptions{everymp={%
  input latexmp;
  setupLaTeXMP(options="12pt", textextlabel = enable, mode = rerun);
  % mark length
  lmark := 6bp;
  % auxiliary macro for segments with marks at their extremities
  vardef segment(expr A, B) =
    save v; pair v; v = 0.5lmark*unitvector(B-A) rotated 90;
    image(draw A--B; for M = A, B: draw M+v -- M-v; endfor;)
  enddef;
  % function defining the length of the segments (borrowed from Henri Menke)
  vardef f(expr x) = -10/x enddef;}}

\begin{document}
\begin{center}
  \begin{mpost*}
    u := 1cm; n := 11;
    for i= 1 upto n-1:
      draw segment(u*(i, 0), u*(i, f(i)));
      label.top("$\ell_{" & decimal(i) & "}$", u*(i, 0));
    endfor;
    label("$\ldots$", u*(n, 0.5f(n)));
  \end{mpost*}
\end{center}
\end{document}

在此处输入图片描述

答案4

没有 PSTricks 就没有乐趣。以下是最优化的 PSTricks 解决方案。您还能做更多吗?

\documentclass[pstricks]{standalone}
\SpecialCoor
\begin{document}
\begin{pspicture}[arrows=|-|](0,-11)(13,1)
    \foreach \i in {1,...,11}{\uput[90](\i,0){$l_{\i}$}\psline(\i,0)(*{\i} {-10/x})}
    \rput(*12 {-5/x}){\ldots}
\end{pspicture}
\end{document}

在此处输入图片描述

相关内容