我怎样用 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
,但幸运的是,在需要时使用它来定义辅助宏很容易(至少我觉得如此))。pstricks
mfpic
\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}