有人知道如何实现图中所示的效果吗?使用 expex 排版注释语言示例,我希望能够在行中的表达式\gla
及其注释周围绘制一个框\glb
。
最小工作示例(没有所需的框):
\documentclass{article}
\usepackage{expex}
\begin{document}
\ex
\begingl
\gla Si fuera m\'as alto ser\'ia un jugador de baloncesto.//
\glb If be.3.sg.PAST.SUBJ more tall be.3.sg.COND a player of basketball//
\glft `If s/he was taller, s/he would be a basketball player'//
\endgl
\xe
\end{document}
答案1
与 David 使用fit
TikZ 库的版本不同。您需要指定三个点,而\tizkmark
不是两个点,因为 TikZ 无法知道要标记的单词组中哪个更长。如果底部组更长(如第一个示例所示),则只需要两个标记,但这在第二个示例中不起作用,因为顶部组更长,因此您需要标记顶部组的开始和结束以及底部组的结束。
简单版本
使用tikzmark
包(见下面的复杂版本)会给此解决方案带来一些复杂性,但这对于此目的来说其实是不必要的(尽管在其他情况下很有用)。具体来说,上述解决方案要求您使用的每个框都有一组唯一的标签。如果您经常使用它,这会变得很烦人。
tikzmark
通过使用不使用该包的更简单版本,您可以完全避免这种情况,然后使用一个仅\boxit
用于默认情况的命令,并且每次都可以使用同一组标签。
在此版本中,标签使用以下方案,其中<start>
是左上角标记。这些必须为数字,默认从1开始。
<start> <start+1> <start+2>
现在,您可以对所有框使用\tikzmark{1}
, \tikzmark{2}
, ,\tikzmark{3}
除非您在一个示例中有多个框。在这种情况下,将起始数字增加 3。
现在要对节点进行装箱,您可以使用:
\boxit % this assumes nodes start at 1
或者在一个示例中包含多个框,使用带星号的版本并将起始节点号作为参数。
\boxit*{<start>} % gives an explicit start
这是完整的示例,其中显示了同一个例子中的两个框,然后在后续的例子中显示了使用相同1
, 2
,标记的另一个框。3
此解决方案适用于 ExPex 的常规注释语法以及nlevel
语法。对于nlevel
格式化示例,您需要确保\tikzmark
注释中的命令是里面不在[ ... ]
它们之外。对于此语法,我还增加了glspace
注释的参数,因为间距似乎与nlevel
语法更紧密。
\documentclass[10pt]{article}
\usepackage{expex}
\usepackage{tikz}
\usetikzlibrary{fit}
\newcommand{\tikzmark}[1]{\tikz[remember picture,overlay] \node (#1) {};}
\makeatletter
\newcommand{\boxit}{\@ifstar\@boxit\@@boxit}
\newcommand{\@@boxit}{\@boxit{1}}
\newcommand\@boxit[1]{%
\tikz[overlay,remember picture]{
\def\pointlist{}
\pgfmathsetmacro{\endpoint}{#1+2}
\foreach \x in {#1,...,\endpoint}
{\xdef\pointlist{\pointlist(\x)}}%
\node[draw,rectangle,yshift=3.5pt,thick,
fit=\pointlist,
inner sep=1pt,text depth=\baselineskip] {};
}}
\makeatother
\begin{document}
\ex
\begingl
\gla \tikzmark{1}Si fuera\tikzmark{2} m\'as alto ser\'ia \tikzmark{4}un jugador\tikzmark{5} de baloncesto.//
\glb If be.3.sg.PAST.SUBJ\tikzmark{3} more tall be.3.sg.COND a player\tikzmark{6} of basketball//
\glft `If s/he was taller, s/he would be a basketball player’//
\endgl
\xe
\boxit
\boxit*{4}
\ex
\begingl
\gla Si fuera m\'as alto ser\'ia \tikzmark{1}un jugador\tikzmark{2} de baloncesto.//
\glb If be.3.sg.PAST.SUBJ more tall be.3.sg.COND a player\tikzmark{3} of basketball//
\glft `If s/he was taller, s/he would be a basketball player'
\endgl
\xe
\boxit
% example with the nlevel sytax
\ex[glstyle=nlevel,glspace=.7em plus .4em minus .15em]
\begingl \tikzmark{1}Si[If] fuera\tikzmark{2}[be.3.PAST.SUBJ\tikzmark{3}] m\'as[more] alto[tall] ser\'ia[be.3.sg.COND] un[a] jugador[player] de[of] baloncesto.[basketball]
\glft If s/he was taller, s/he would be a basketball player//
\endgl \xe
\boxit
\end{document}
原始的、更复杂的版本
这是答案的原始版本,它要求每个标记都有唯一的节点,并要求您为命令提供\boxit
一个带有适当标签的参数。我认为这不太容易使用,但我将其留在这里以供后人参考。
\documentclass{article}
\usepackage{expex}
\usepackage{tikz}
\usetikzlibrary{tikzmark,fit}
\newcommand\boxit[1]{%
\tikz[overlay,remember picture]{%
\node[draw,rectangle,yshift=3.5pt,thick,
fit=(pic cs:a#1) (pic cs:b#1) (pic cs:c#1),
inner sep=3.5pt,text depth=\baselineskip] {};
}}
\begin{document}
\ex
\begingl
\gla \tikzmark{a1}Si fuera\tikzmark{b1} m\'as alto ser\'ia un jugador de baloncesto.//
\glb If be.3.sg.PAST.SUBJ\tikzmark{c1} more tall be.3.sg.COND a player of basketball//
\glft `If s/he was taller, s/he would be a basketball player'//
\endgl
\xe
\boxit{1}
\ex
\begingl
\gla Si fuera m\'as alto ser\'ia \tikzmark{a2}un jugador\tikzmark{b2} de baloncesto.//
\glb If be.3.sg.PAST.SUBJ more tall be.3.sg.COND a player\tikzmark{c2} of basketball//
\glft `If s/he was taller, s/he would be a basketball player'//
\endgl
\xe
\boxit{2}
\end{document}
答案2
put
使用命令在文本上书写:
\documentclass{article}
\usepackage{expex,pict2e}
\unitlength=1cm
\begin{document}
\ex
\begingl
\gla Si \makebox(0,0){\put(1.45,-0.1){\oval[0.1](3.3,1)}}%
fuera más alto sería un jugador de baloncesto.//
\glb If be.3.sg.PAST.SUBJ more tall be.3.sg.COND a player of basketball//
\glft If s/he was taller, s/he would be a basketball player//
\endgl
\xe
\end{document}
\makebox(0,0)
对于宽度/高度为 0pt 的框来获得覆盖。\put(1.45,-0.1)
根据当前点将以下参数置于 1.45,-0.1 单位处。\oval[0.1](3.3,1)
最大圆角半径为 0.1,宽度/高度为 3.3/1 的椭圆