如何为不同行的文本添加边框

如何为不同行的文本添加边框

我正在尝试重现这一点: 在此处输入图片描述

我可以重现所有内容,除了“约翰睡觉”下面的框架之外:

在此处输入图片描述

我最初尝试使用gb4e,但没有找到解决方案。现在,我的示例是使用环境手写的tabbing。代码如下:

\documentclass[]{article}
\begin{document}
\begin{tabbing}
\hspace{0.8em} \hspace{6em} \= \textit{Paul} \hspace{1.5em} \= 
\textit{thinks} \hspace{2.8em} \= \textit{that} \hspace{2.5em} \= 
\textit{John} \hspace{1.2em} \= \textit{sleeps}\\~\\
\hspace{0.8em}$(14)$ \hspace{5em} \= $n$ \hspace{2em} \= $s/(n)[n]$ 
\hspace{2em} \= $n/[s]$ \hspace{3em} \= $n$ \hspace{2em} \= $s/(n)$\\
\hspace{0.8em}$(15)$ \hspace{5em} \> $n$ \hspace{2em} \> $s/(n)[n]$ 
\hspace{2em} \> $n/[s]$ \hspace{4.8em} \= $s$\\
\hspace{0.8em}$(16)$ \hspace{5em} \> $n$ \hspace{2em} \> $s/(n)[n]$ 
\hspace{5em} \= $n$\\
\hspace{0.8em}$(17)$ \hspace{5em} \> \> \= \hspace{2.5em} $s.$
\end{tabbing}
\end{document}

我怎样才能让这个框架n秒/(n)第 14 行和s第 15 行,就像第一张图片一样?

答案1

值得一提的是,这里有一个使用tabular而不是 的解决方案tabbing。它看起来并不完全像您的屏幕截图,但我认为它很接近,输入对我来说似乎更自然,并且不需要手动留出空格,这需要反复试验并使源代码难以阅读。

countedtabular是自动对行进行编号的表格;标题/第一行未编号。您可以使用可选参数从不同的计数器继续计数(例如,如果您使用gb4eexe环境)。

在下面的例子中,所有列都有固定大小 1.3 厘米,但您可以改变大小或使用d/c进行自动调整大小。

由于您使用了数学模式,因此所有列都会自动设置为数学模式。如果您不喜欢这样,可以切换到非数学模式的列说明符。

用 Ti 绘制的方框Z 使用fit库(参见§52配件库PGF 手册)。您只需标记您想要位于矩形框内的点,其余部分或多或少会自动完成。如果您使用节点,您会得到更好的结果\tikzmark(请参阅https://tex.stackexchange.com/a/235662/35864)。您无需像 一样直接在单元格中键入要包含在框中的文本s/(n),而是为其指定一个巧妙的名称 ( cell-sn) 并将其包装在\tikztextmark:中\tikztextmark{cell-sn}{s/(n)}。然后您只需命名cell-sn\drawboxaroundnodes它就会包含在框中。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}

\usepackage{array}
% new column formats 
% math mode built in
\newcolumntype{k}{>{$}l<{$}}
\newcolumntype{d}{>{$}c<{$}}
\newcolumntype{q}{>{$}r<{$}}
% fixed width
% see lockstep's answer in https://tex.stackexchange.com/a/12712/35864
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
% fixed width and math
\newcolumntype{K}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}$}p{#1}<{$}}
\newcolumntype{D}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}$}p{#1}<{$}}
\newcolumntype{Q}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}$}p{#1}<{$}}

\usepackage{etoolbox}


% this implements a table with numbered rows
% if the optional argument is specified the counter of that name 
% is used to display the row numbers
\makeatletter
\newcounter{ctdtb@rowcount}
\newenvironment{countedtabular}[2][ctdtb@rowcount]
  {\noindent
   \setlength{\tabcolsep}{1em}%
   \setcounter{ctdtb@rowcount}{-1}%
   \begin{tabular}%
     {@{}%
      >{\refstepcounter{ctdtb@rowcount}%
        \ifnumgreater{\value{ctdtb@rowcount}}{0}
          {\ifstrequal{#1}{ctdtb@rowcount}
             {}%                    only step the counter
             {\refstepcounter{#1}}% if it is not the row counter
           (\csuse{the#1})}
          {}}R{22.77222pt}%<- hard-coded for gb4e, \labelwidth would work for normal enumerates
      #2}}
  {\end{tabular}}


\usepackage{tikz}
\usetikzlibrary{calc,fit}
\newif\ifstartedinmathmode
% https://tex.stackexchange.com/a/235662/35864
% https://tex.stackexchange.com/a/46496/35864
% set a node at position of text
% star: if star: no-autodetection of mode text typeset in text mode
%       no star:  surrounding text/math mode is detected and preserved 
% first argument: internal name of the node
% second argument: text
% e.g.: \tikztextmark{nodefoo}{Hullo} typesets "Hullo"
% the position can then be called with nodefoo
\newcommand{\tikztextmark}{%
  \@ifstar
    {\startedinmathmodefalse}
    {\relax
     \ifmmode
       \startedinmathmodetrue
     \else
       \startedinmathmodefalse
     \fi}%
  \tikztextmark@i}

\newcommand*{\tikztextmark@i}[2]{%
  \tikz[overlay,remember picture,baseline]\node [anchor=base] (#1)
    {\ifstartedinmathmode$#2$\else#2\fi};}

% automatically draw a box around the given coordinates
% optional argument to change the style and other settings
% mandatory argument takes a list of coordinates
\newcommand*{\drawboxaroundnodes}[2][]{%
  \begin{tikzpicture}[overlay,remember picture]
  \node[draw=black, thick, inner sep=0pt, fit=#2, #1] {};
  \end{tikzpicture}%
}
\makeatother

\makeatletter
\newcounter{examples}
\usepackage{gb4e,enumitem}
\begin{document}
\begin{exe}
\ex Hallo
\ex Bye
\end{exe}

\begin{exe}
\ex Hallo
\ex Tschüss
\end{exe}

% compare and contrast the third and fourth row for different placement of the text
% compare and contrast the first and second row for the box anchors
\begin{countedtabular}[exx]{*{5}{D{1.3cm}}}
&\textit{Paul}&\textit{thinks}&\textit{that}&\textit{John}&\textit{sleeps}\\[12pt]
&n & s/(n)[n] & n/[s] & n & s/(n)\\
&n & s/(n)[n] & n/[s] & \multicolumn{2}{d}{s}\\
&n & s/(n)[n] & \multicolumn{3}{d}{n}\\
&\multicolumn{5}{d}{s.}\\
\end{countedtabular}

\begin{countedtabular}[exx]{*{5}{D{1.3cm}}}
&\textit{Paul}&\textit{thinks}&\textit{that}&\textit{John}&\textit{sleeps}\\[12pt]
&n & s/(n)[n] & n/[s] & \tikztextmark{cell-n}{n} & \tikztextmark{cell-sn}{s/(n)}\\
&n & s/(n)[n] & n/[s] & \multicolumn{2}{c}{\tikztextmark{cell-s}{s}}\\
&n & s/(n)[n] & \multicolumn{2}{d}{n}\\
&&\multicolumn{1}{q}{s.}\\
\end{countedtabular}
% draw the box: give all coordinates in round brackets
\drawboxaroundnodes{(cell-sn) (cell-s) (cell-n)}

\begin{exe}
\ex Hoi
\ex Doei
\end{exe}

\end{document}

在此处输入图片描述

答案2

TikZ 通常是绘制框架的好方法,下面是我使用的代码:

\documentclass[]{article}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{booktabs}

\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[3][]{%
    \tikz[overlay,remember picture]{
    \draw[black,#1]
      ($(#2)+(-0.5em,2.0ex)$) rectangle
      ($(#3)+(0.75em,-0.75ex)$);}
}

\begin{document}
\begin{tabbing}
\hspace{0.8em} \hspace{6em} \= \textit{Paul} \hspace{1.5em} \= 
\textit{thinks} \hspace{2.8em} \= \textit{that} \hspace{2.5em} \= 
\textit{John} \hspace{1.2em} \= \textit{sleeps}\\~\\
\hspace{0.8em}$(14)$     \hspace{5em} \= $n$ \hspace{2em} \= $s/(n)[n]$ 
\hspace{2em} \= $n/[s]$ \hspace{3em} \= \tikzmark{top left 1} $n$\hspace{2em} \= $s/(n)$\\
\hspace{0.8em}$(15)$     \hspace{5em} \> $n$ \hspace{2em} \> $s/(n)[n]$ \hspace{2em} \> $n/[s]$ \hspace{4.8em} \= $s$ \hspace{20pt}\tikzmark{bottom right 1} \\
\hspace{0.8em}$(16)$     \hspace{5em} \> $n$ \hspace{2em} \> $s/(n)[n]$ 
\hspace{5em} \= $n$\\
\hspace{0.8em}$(17)$ \hspace{5em} \> \> \= \hspace{2.5em} $s.$
\end{tabbing}

\DrawBox[thin, black]{top left 1}{bottom right 1}

\end{document}

在此处输入图片描述

我使用的代码来自这个邮政。您可以对框架的大小、颜色等进行更多调整... 想法是将 Tikzmarks 定位在表格中,然后在它们周围绘制框架作为覆盖层。

希望能帮助到你。

罗曼

相关内容