我有一个很长的句子,我希望句子的不同部分具有不同的透明度。但是,整个句子应该被包裹在一个颜色框中:
\documentclass{article}
\usepackage{soul,xcolor}
\usepackage{transparent}
\sethlcolor{red}
\begin{document}
\hl{This is}%
\transparent{0.1}{\hl{\strut a great sentence. }}%
\transparent{0.5}{\hl{\strut a great sentence}}
\end{document}
从技术上讲这是可行的,但在 PDF 中我看到一些垂直红线:
这些伪影是什么?它们可以被去除吗?
编辑:是否可以只使颜色框透明,而不使文本本身透明?
答案1
在原贴作者的评论中,似乎透明度只是手段,而不是问题的目的。我建议仅使用不同的颜色框颜色作为手段。它不会产生改变文本黑度的不利影响,并消除伪影。
现在如果需要断线,就需要做更多的事情。
\documentclass{article}
\usepackage{xcolor}
\begin{document}
\fboxsep=0pt\relax
\colorbox{red}{\strut This is }%
\colorbox{red!50}{\strut a great sentence. }%
\colorbox{red!10}{\strut a great sentence}
\end{document}
对于换行问题,可以使用一种方法来解析参数以寻找单词间空格并允许单词之间换行。但是,在框内,不会添加粘连(并且连字符不起作用)。因此,这种方法实际上只有在设置了\raggedright
(或\sloppy
) 时才有意义。请参阅附录下面了解如何解决充分理由。
\documentclass{article}
\usepackage[showframe,pass]{geometry}% ONLY USED TO SHOW MARGINS
\usepackage{xcolor}
\newcommand\bcolorbox[2]{\bcbaux{#1}#2 \endbcb}
\def\bcbaux#1#2 #3\endbcb{%
\colorbox{#1}{\strut#2}%
\ifx\relax#3\relax\def\next{}\else%
\colorbox{#1}{ \strut}%
\allowbreak%
\def\next{\bcbaux{#1}#3\endbcb}%
\fi%
\next%
}
\begin{document}
\raggedright
\fboxsep=0pt\relax
\bcolorbox{red}{This is }%
\bcolorbox{red!50}{a great sentence. }%
\bcolorbox{red!10}{a great sentence...}%
\bcolorbox{red!30}{Now we can test for the ability to line break. }%
\bcolorbox{blue!20}{Will this ability to break lines continue
as I continue in several such boxes?}
\end{document}
附录
在研究如何使上述换行解决方案完全对齐后,我意识到,我可以将单词间空格添加为高亮( ) \colorbox
,而不是将其添加为(不会拉伸),这样可以进行粘连拉伸。soul
\hl
第一个问题是宏的高度与 我发现的两个参考soul
\hl
高度不同,\baselineskip
让灵魂凸显跨越界限和如何用灵魂定制高光高度,展示了如何调整这一点。
它几乎开箱即用,只是和的支柱大小的盒子在\colorbox
垂直\hl
方向上偏移了少量(我发现这非常奇怪和出乎意料......似乎的第一个参数\setul
没有效果,至少在我对的序言更改中\SOUL@hlpreamble
)。
最初,我能够用两个解决办法来弥补这种奇怪的行为:
\strut
我没有将添加到,而是\colorbox
将 稍微移动 添加\mystrut
到框中。我不得不
\smash
这样做\colorbox
,因为现在不寻常的转变拉长了行距。
然而,我后来发现它是一种错误soul
并找到了解决方法。上面引用的参考文献提倡\SOUL@hlpreamble
通过 来重置突出显示的尺寸\setul
。但是,传递给 的第一个尺寸\setul
(深度)会立即被 的调用破坏\SOUL@stpreamble
。
因此,我对 的第二次调整soul
是进行修改\SOUL@stpreamble
,以免重置\SOUL@uldepth
。我不认为我的修复是通用的,但它显然是一个错误,因为对\setul
in的调用\SOUL@hlpreamble
对 没有任何影响\SOUL@uldepth
,尽管它应该有影响。
MWE 给出了充分的理由:
\documentclass{article}
\usepackage[showframe,pass]{geometry}% ONLY USED TO SHOW MARGINS
\usepackage{xcolor,soul}
\newcommand\bcolorbox[2]{\leavevmode\bcbaux{#1}#2 \endbcb}
\def\bcbaux#1#2 #3\endbcb{%
\colorbox{#1}{\strut#2}%
\ifx\relax#3\relax\def\next{}\else%
\sethlcolor{#1}%
\hl{ }%
\def\next{\bcbaux{#1}#3\endbcb}%
\fi%
\next%
}
\makeatletter
\def\SOUL@hlpreamble{%
\setul{-\ht\strutbox}{\baselineskip}% 1ST ARGUMENT REPLACED IN \SOUL@stpreamble
\let\SOUL@stcolor\SOUL@hlcolor
\SOUL@stpreamble% OVERWRITES 1ST ARGUMENT TO \setul
}
\def\SOUL@stpreamble{%
\dimen@\SOUL@ulthickness
\dimen@i=-.5ex
\advance\[email protected]\dimen@
% \edef\SOUL@uldepth{\the\dimen@i}% THIS OVERWRITES PRIOR SPECIFIED VALUE
\let\SOUL@ulcolor\SOUL@stcolor
\SOUL@ulpreamble
}
\makeatother
\begin{document}
\fboxsep=0pt\relax
\bcolorbox{red}{This is }%
\bcolorbox{red!50}{a great sentence. }%
\bcolorbox{red!10}{a great sentence...}%
\bcolorbox{red!30}{Now we can test for the ability to line break. }%
\bcolorbox{blue!20}{Will this ability to break lines continue
as I continue in several such boxes?}
\end{document}