我在我的语言学文档中附上了一个元音图表,与此类似,虽然我知道有几个包(TIPA、pst-vowel)可以完成这项工作,但我有兴趣尝试使用 PGF/TikZ 绘制它。我以前没有用过 TikZ,所以我有点不确定从哪里开始画这个看似简单的图。
据我了解,我需要定义某种倾斜网格,其中的[默认]节点位于线的交点、中点和每个“正方形”的中间。然后实际的字母将绘制在上面,并按坐标定位;目前我对图中出现的字母的任意定位不感兴趣。
谁能帮我吗?
答案1
如果您不需要 PGF/TikZ 3.0,您可以使用此技巧来模拟仿射变换。
(0, 0)
我定义了一个命令,其输入是到范围内的“笛卡尔”坐标,其输出是梯形(3, 2)
四个角(称为、、hf
和)定义的重心系统¹中的坐标。hb
lf
lb
\def\V(#1,#2){barycentric cs:hf={(3-#1)*(2-#2)},hb={(3-#1)*#2},lf={#1*(2-#2)},lb={#1*#2}}
自由使用此\V
命令可以很容易地将节点放置在梯形中。
代码
\documentclass[12pt]{standalone}
\usepackage{tikz}
% Requires xelatex for the magnificent Brill font
\usepackage{fontspec}
\setmainfont{Brill}
\begin{document}
\begin{tikzpicture}[scale=3]
\large
\tikzset{
vowel/.style={fill=white, anchor=mid, text depth=0ex, text height=1ex},
dot/.style={circle,fill=black,minimum size=0.4ex,inner sep=0pt,outer sep=-1pt},
}
\coordinate (hf) at (0,2); % high front
\coordinate (hb) at (2,2); % high back
\coordinate (lf) at (1,0); % low front
\coordinate (lb) at (2,0); % low back
\def\V(#1,#2){barycentric cs:hf={(3-#1)*(2-#2)},hb={(3-#1)*#2},lf={#1*(2-#2)},lb={#1*#2}}
% Draw the horizontal lines first.
\draw (\V(0,0)) -- (\V(0,2));
\draw (\V(1,0)) -- (\V(1,2));
\draw (\V(2,0)) -- (\V(2,2));
\draw (\V(3,0)) -- (\V(3,2));
% Place all the unrounded-rounded pairs next, on top of the horizontal lines.
\path (\V(0,0)) node[vowel, left] {i} node[vowel, right] {y} node[dot] {};
\path (\V(0,1)) node[vowel, left] {ɨ} node[vowel, right] {ʉ} node[dot] {};
\path (\V(0,2)) node[vowel, left] {ɯ} node[vowel, right] {u} node[dot] {};
\path (\V(0.5,0.4)) node[vowel, left] {ɪ} node[vowel, right] {ʏ} node[dot] {};
\path (\V(0.5,1.6)) node[vowel, left] { } node[vowel, right] {ʊ} node[dot] {};
\path (\V(1,0)) node[vowel, left] {e} node[vowel, right] {ø} node[dot] {};
\path (\V(1,1)) node[vowel, left] {ɘ} node[vowel, right] {ɵ} node[dot] {};
\path (\V(1,2)) node[vowel, left] {ɤ} node[vowel, right] {o} node[dot] {};
\path (\V(2,0)) node[vowel, left] {ɛ} node[vowel, right] {œ} node[dot] {};
\path (\V(2,1)) node[vowel, left] {ɜ} node[vowel, right] {ɞ} node[dot] {};
\path (\V(2,2)) node[vowel, left] {ʌ} node[vowel, right] {ɔ} node[dot] {};
\path (\V(2.5,0)) node[vowel, left] {æ} node[vowel, right] { } node[ ] {};
\path (\V(3,0)) node[vowel, left] {a} node[vowel, right] {ɶ} node[dot] {};
\path (\V(3,2)) node[vowel, left] {ɑ} node[vowel, right] {ɒ} node[dot] {};
% Draw the vertical lines.
\draw (\V(0,0)) -- (\V(3,0));
\draw (\V(0,1)) -- (\V(3,1));
\draw (\V(0,2)) -- (\V(3,2));
% Place the unpaired symbols last, on top of the vertical lines.
\path (\V(1.5,1)) node[vowel] {ə};
\path (\V(2.5,1)) node[vowel] {ɐ};
\end{tikzpicture}
\end{document}
结果
最后,这是在 TikZ 中绘制的完整 IPA 元音表:
抱歉回复晚了。不过,我希望这能帮助到将来想画这个的人。顺便说一句,你可以得到语言学上极其优秀的 Brill 字体这里免费。
¹ 您可以在第 13.2.2 节“重心系统”PGF/TikZ 手册。
答案2
使用新版本的 TikZ v3.0,您还可以定义非线性变换:
\documentclass[tikz]{standalone}
\usetikzlibrary{quotes,calc}
\usepgfmodule{nonlineartransformations}
\makeatletter
\def\ydepxskew{%
\pgfmathqparse{0.02\pgf@y}%Adjust 0.02 for skewness amount
\pgf@x=\pgfmathresult\pgf@x%
\pgf@y=\pgf@y%
}
\makeatother
\begin{document}
\begin{tikzpicture}[myipa/.style 2 args={circle,fill,inner sep=0pt, "#1" {#2}}]
{
\pgftransformnonlinear{\ydepxskew}
\draw (0pt,15mm) grid [xstep=10mm, ystep=15mm] (-20mm, 60mm);
\foreach \x in {0,1,2}{
\foreach \y in {0,1,2,3}{
\coordinate (n-\x-\y) at ({-\x*10mm},{(\y+1)*15mm});
}
}
}
\node[myipa={\o}{left}] at ($(n-2-3)!0.4!(n-1-1)$) {a};
\draw[red,thick] (n-0-3) -- (n-1-1);
\end{tikzpicture}
\end{document}
答案3
下面的代码正确地将四边形的顶部、右侧和底部的比例设置为 4:3:2,并给出了两个如何使用坐标放置元音的示例xy
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[vowel/.style={fill, circle, inner sep=0pt, text height=1.25ex}]
\coordinate (hf) at (0,3); % the high front vertex
\coordinate (hb) at (4,3); % the high back vertex
\coordinate (lb) at (4,0); % the low back vertex
\coordinate (lf) at (2,0); % the low front vertex
\draw (hf) -- (hb) -- (lb) -- (lf) -- cycle; % draws the trapezoid
\draw ($(hf)!1/3!(lf)$) -- ($(hb)!1/3!(lb)$); % the high-mid line
\draw ($(hf)!2/3!(lf)$) -- ($(hb)!2/3!(lb)$); % the low-mid line
\draw ($(hf)!0.5!(hb)$) -- ($(lf)!0.5!(lb)$); % the center line
\node[vowel,label={[label distance=-1pt]left:i}] at (0.8,2.6) {}; % places the [i] vowel at (0.8,2.6)
\node[vowel,label={[label distance=-3pt]below right:o}] at (3.5,1.7) {}; % places the [o] vowel at (3.5,1.7)
\end{tikzpicture}
\end{document}