expex:框出短语及其注释

expex:框出短语及其注释

有人知道如何实现图中所示的效果吗?使用 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 使用fitTikZ 库的版本不同。您需要指定三个点,而\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 的椭圆

相关内容