答案1
此解决方案经过编辑,允许打击多个方面。
制作成宏\partbox{<sides>}{<content>}
,其中是要打击的面,以、、或 的sides
任意组合(任意顺序)进行组合。通过使用,可以使用和进行自定义。l
b
r
t
\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 of
。calc
这将创建一个具有自动宽度的完整框架框:
\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}