如何在段落中的一个或多个单词周围绘制部分或不完整的框

如何在段落中的一个或多个单词周围绘制部分或不完整的框

我正在尝试在段落中的一个或多个单词周围绘制一个部分框,即缺​​少一条或多条边的矩形。我已阅读该fancybox软件包的文档,但它似乎无法实现我想要的功能。我只能制作出这样丑陋的 hack:

在此处输入图片描述

那只是一个竖线 | 后面跟着一个带有 \overline 和 \uline 的单词。诀窍是连接竖线和横线,这样你就得到了一个只缺少一条边的矩形。

有没有一种简单、通用的方法可以做到这一点,比如使用 Tikz?我对该软件包了解不够多,无法自己做到这一点,但我想知道是否还有其他解决方案。

答案1

此解决方案经过编辑,允许打击多个方面。

制作成宏\partbox{<sides>}{<content>},其中是要打击的面,以、、或 的sides任意组合(任意顺序)进行组合。通过使用,可以使用和进行自定义。lbrt\fbox\fboxsep\fboxrule

作为一个方框,如果单词多于一个,则不允许跨越一行。

\documentclass{article}
\usepackage{trimclip}
\newif\iflclip
\newif\ifbclip
\newif\ifrclip
\newif\iftclip
\def\CLIP{\dimexpr\fboxrule+.2pt\relax}
\def\nulclip{0pt}
\newcommand\partbox[2]{%
  \lclipfalse\bclipfalse\rclipfalse\tclipfalse%
  \let\lkern\relax\let\rkern\relax%
  \let\lclip\nulclip\let\bclip\nulclip\let\rclip\nulclip\let\tclip\nulclip%
  \parseclip#1\relax\relax%
  \iflclip\def\lkern{\kern\CLIP}\def\lclip{\CLIP}\fi
  \ifbclip\def\bclip{\CLIP}\fi
  \ifrclip\def\rkern{\kern\CLIP}\def\rclip{\CLIP}\fi
  \iftclip\def\tclip{\CLIP}\fi
  \lkern\clipbox{\lclip{} \bclip{} \rclip{} \tclip}{\fbox{#2}}\rkern%
}
\def\parseclip#1#2\relax{%
  \ifx l#1\lcliptrue\else
  \ifx b#1\bcliptrue\else
  \ifx r#1\rcliptrue\else
  \ifx t#1\tcliptrue\else
  \fi\fi\fi\fi
  \ifx\relax#2\relax\else\parseclip#2\relax\fi
}
\parskip 1ex
\begin{document}
\partbox{l}{dans} \partbox{b}{dans} \partbox{r}{dans} \partbox{t}{dans}

\partbox{lt}{dans} \partbox{lr}{dans} \partbox{lb}{dans}

\partbox{tb}{dans} \partbox{tr}{dans}

\partbox{br}{dans}

\partbox{rlt}{dans} \partbox{rbt}{dans} \partbox{blt}{dans} \partbox{blr}{dans}
\end{document}

在此处输入图片描述

\fboxsep只是为了展示使用和的能力\fboxrule,这里是相同的结果,但\fboxsep=0pt\relax\fboxrule=1pt\relax在文档开头设置:

在此处输入图片描述

如果希望它不干扰行距,那么这个调整应该可以工作,添加\vphantom\smash。当然,如果\fboxsep和/或\fboxrule设置得足够大,它不会阻止重叠(注意:此解决方案仍然是原始版本,仅允许删除单侧):

\documentclass{article}
\usepackage[nopar]{lipsum}
\usepackage{trimclip}
\def\CLIP{\dimexpr\fboxrule+.2pt\relax}
\newcommand\partbox[2]{\leavevmode\vphantom{#2}\smash{%
  \ifx#1l\clipbox{\CLIP{} 0pt 0pt 0pt}{\fbox{#2}}\else
  \ifx#1b\clipbox{0pt \CLIP{} 0pt 0pt}{\fbox{#2}}\else
  \ifx#1r\clipbox{0pt 0pt \CLIP{} 0pt}{\fbox{#2}}\else
  \ifx#1t\clipbox{0pt 0pt 0pt \CLIP{}}{\fbox{#2}}\else
  \fi\fi\fi\fi
}}
\parskip 1ex
\begin{document}
\lipsum[4] \partbox{l}{dans}
\lipsum[4] \partbox{b}{dans}
\lipsum[4] \partbox{r}{dans}
\lipsum[4] \partbox{t}{dans}
\lipsum[4] 
\end{document}

在此处输入图片描述

答案2

有没有一种简单、通用的方法可以做到这一点,例如使用 Tikz?

我无法理解人们为什么喜欢用大锤砸核桃。也许用tabular?

在此处输入图片描述

\documentclass{article}
\begin{document}
\tabcolsep.2em
Un voyage \begin{tabular}{|c }\hline dans\\\hline \end{tabular} l'space. 
Un voyage \begin{tabular}{|c|}\hline dans\\       \end{tabular} l'space. 
Un voyage \begin{tabular}{ c|}\hline dans\\\hline \end{tabular} l'space. 
Un voyage \begin{tabular}{|c|}       dans\\\hline \end{tabular} l'space. 
\end{document}

如果您不喜欢tabular,某些\makebox和命令\rule\vrule可以完成相同的工作。但是,手动找到水平规则的正确宽度非常繁琐。但可以使用包解决这个问题\widthof ofcalc这将创建一个具有自动宽度的完整框架框:

\vrule%
\makebox[0pt][l]{\rule[-.25em]{\widthof{dans}+.2em}{.4pt}}% 
\makebox[0pt][l]{\rule[.85em]{\widthof{dans}+.2em}{.4pt}}%
\makebox[\widthof{dans}+.2em][c]{dans}%
\vrule\ 

只需删除上述代码中的第 1、2、3 或 5 行,即可获得不完整的框。

在宏中转换这两种解决方案很简单。为简单起见,我建议制作四个宏,其中文本是唯一的参数,而不是一个带有两个参数的宏。例如:

\documentclass{article}
\usepackage{calc}
\newcommand\openleftbox[1]{%
\vrule
\makebox[0pt][l]{\rule[-.25em]{\widthof{#1}+.2em}{.4pt}}% 
\makebox[0pt][l]{\rule[.85em]{\widthof{#1}+.2em}{.4pt}}%
\makebox[\widthof{#1}+.2em][c]{#1}%
%\vrule\ 
}
\begin{document}
Un voyage \openleftbox{dans} l'space. 
\end{document}

答案3

另一个解决方案是tcbox(来自tcolorbox

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{lmodern}

\newtcbox{\lbox}[1][]{on line, sharp corners, colback=white, colframe=black, size=small, leftrule=0pt,#1}

\newtcbox{\rbox}[1][]{on line, sharp corners, colback=white, colframe=black, size=small, rightrule=0pt,#1}

\newtcbox{\tbox}[1][]{on line, sharp corners, colback=white, colframe=black, size=small, toprule=0pt,#1}

\newtcbox{\bbox}[1][]{on line, sharp corners, colback=white, colframe=black, size=small, bottomrule=0pt,#1}

\begin{document}

The \lbox{quick} \tbox{brown} \bbox{fox} \rbox{jumps} over the \lbox[colback=red!30, colframe=blue]{lazy dog}.

\end{document}

在此处输入图片描述

答案4

包裹fbox已添加到 CTAN。此包向 添加了可选参数\fbox。此新参数允许声明应绘制哪些框边。

\documentclass{article}
\usepackage{fbox}

\begin{document}

The \fbox[tb]{quick} \fbox[lr]{brown} \fbox[ltb]{fox} \fbox[trb]{jumps} \fbox[lb]{over} \fbox[tr]{the} \fbox{lazy dog}.

\end{document}

在此处输入图片描述

相关内容