有没有什么办法可以突出显示中文、日语和韩语的文本或句子?目前我还不知道。
但如果有人愿意帮助我使用 LaTeX 中的 CJK,这种情况就会改变。
问题:
如果使用 CJK 文本或基于它的其他代码突出显示
soul
,则突出显示根本不起作用。例如: LaTeX 中的酷炫文本突出显示
我试过:
\documentclass[nofonts]{ctexbook} \setCJKmainfont{SimSun} \usepackage{soul} \usepackage{tikz} \usetikzlibrary{calc} \usetikzlibrary{decorations.pathmorphing} \makeatletter \newcommand{\defhighlighter}[3][]{% \tikzset{every highlighter/.style={color=#2, fill opacity=#3, #1}}% } \defhighlighter{yellow}{.5} \newcommand{\highlight@DoHighlight}{ \fill [ decoration = {random steps, amplitude=1pt, segment length=15pt} , outer sep = -15pt, inner sep = 0pt, decorate , every highlighter, this highlighter ] ($(begin highlight)+(0,8pt)$) rectangle ($(end highlight)+(0,-3pt)$) ; } \newcommand{\highlight@BeginHighlight}{ \coordinate (begin highlight) at (0,0) ; } \newcommand{\highlight@EndHighlight}{ \coordinate (end highlight) at (0,0) ; } \newdimen\highlight@previous \newdimen\highlight@current \DeclareRobustCommand*\highlight[1][]{% \tikzset{this highlighter/.style={#1}}% \SOUL@setup % \def\SOUL@preamble{% \begin{tikzpicture}[overlay, remember picture] \highlight@BeginHighlight \highlight@EndHighlight \end{tikzpicture}% }% % \def\SOUL@postamble{% \begin{tikzpicture}[overlay, remember picture] \highlight@EndHighlight \highlight@DoHighlight \end{tikzpicture}% }% % \def\SOUL@everyhyphen{% \discretionary{% \SOUL@setkern\SOUL@hyphkern \SOUL@sethyphenchar \tikz[overlay, remember picture] \highlight@EndHighlight ;% }{% }{% \SOUL@setkern\SOUL@charkern }% }% % \def\SOUL@everyexhyphen##1{% \SOUL@setkern\SOUL@hyphkern \hbox{##1}% \discretionary{% \tikz[overlay, remember picture] \highlight@EndHighlight ;% }{% }{% \SOUL@setkern\SOUL@charkern }% }% % \def\SOUL@everysyllable{% \begin{tikzpicture}[overlay, remember picture] \path let \p0 = (begin highlight), \p1 = (0,0) in \pgfextra \global\highlight@previous=\y0 \global\highlight@current =\y1 \endpgfextra (0,0) ; \ifdim\highlight@current < \highlight@previous \highlight@DoHighlight \highlight@BeginHighlight \fi \end{tikzpicture}% \the\SOUL@syllable \tikz[overlay, remember picture] \highlight@EndHighlight ;% }% \SOUL@ } \makeatother \begin{document} 本条所说的三日期间与第98条规定的三日期间在计算上采同样的规则(请参考第98条的释义部分),期间的开始均不是以扣押命令的发出为标准,而是以扣押的生效为准。\highlight[red]{对邮件的扣押,以邮政服务机构收到扣押命令,邮件开始处于被截留的状态,视为扣押的生效(Pfeiffer S471 Rn4)},期间由此开始。期间的开始计算同样适用第42条的规定。 但与第98条不同的是,第98条的三日期间只是向法官提出追认照准的申请的期间,而本条则是收到法官追认照准的期间。邮政服务机构如果在三日内没收到法官的追认,检察官的扣押命令失效,毋需再向检察官交出邮件。但邮件如果已经被交出的,则暂时不被返还,仍可保留在检察官处。如果在三日期满后法官又追认照准的,视为法官作出了新的扣押命令(Meyer-Goßner S325 Rn7)。 \highlight[red]{如果法官在三日内不予照准的呢?如果在三日内没有追认,在三日后也没有作出追认的?如果法官在三日后作出不予照准的呢?六种情况} \end{document}
TeX 报告称:
Package soul Error: Reconstruction failed. See the soul package documentation for explanation.
如果我忽略这些错误并编译 TeX 文件,突出显示的文本将变成黑色方块。
如果使用基于soul的某种代码对CJK文本进行高亮显示,虽然高亮显示可以正常工作,但是文本不能跨行显示,并且文本都在页面边缘之外的一行中。
例如:
\documentclass[nofonts]{ctexbook} \setCJKmainfont{SimSun} \usepackage{soul} \usepackage{tikz} \newcommand*{\yellowhl}[1]{% \tikz[baseline]\node[rectangle, fill=yellow, rounded corners, inner sep=0.3mm,anchor=base]{#1};% } \begin{document} 本条所说的三日期间与第98条规定的三日期间在计算上采同样的规则(请参考第98条的释义部分),期间的开始均不是以扣押命令的发出为标准,而是以扣押的生效为准。\yellowhl{对邮件的扣押,以邮政服务机构收到扣押命令,邮件开始处于被截留的状态,视为扣押的生效(Pfeiffer S471 Rn4)},期间由此开始。期间的开始计算同样适用第42条的规定。 但与第98条不同的是,第98条的三日期间只是向法官提出追认照准的申请的期间,而本条则是收到法官追认照准的期间。邮政服务机构如果在三日内没收到法官的追认,检察官的扣押命令失效,毋需再向检察官交出邮件。但邮件如果已经被交出的,则暂时不被返还,仍可保留在检察官处。如果在三日期满后法官又追认照准的,视为法官作出了新的扣押命令(Meyer-Goßner S325 Rn7)。 \yellowhl{如果法官在三日内不予照准的呢?如果在三日内没有追认,在三日后也没有作出追认的?如果法官在三日后作出不予照准的呢?六种情况} \end{document}
求助:有谁知道该怎么解决吗?
答案1
此答案中的代码可作为软件包使用
http://code.google.com/p/dpctex/source/browse/#svn%2Ftrunk%2Fcjkhl
带有标点符号测试的版本\obeylines
,注释中讨论的原始简化版本位于末尾。看起来(除了这里的示例之外没有其他知识)CJK 标点符号在字体中有宽的侧边距,但排字员也会调整间距,在它们周围留出可拉伸的空间。由于突出显示框分别框出每个字符,这几乎消除了行中的所有灵活性,导致行过满。
第二个版本测试了一些标点符号,并在它们之前或之后添加了 1pt 的拉伸/收缩空间。这可能不是排字员在非高亮情况下会使用的空间量,我希望这不会造成任何文化恐慌,当你不知道文本的含义时,很难做到这一点。在最后的原始图像中,最后一行看起来过满,在这个新版本中,周围的额外收缩 ?
使行与右边距齐平。
\documentclass[nofonts]{ctexbook}
\setCJKmainfont{SimSun}
\definecolor{lightblue}{rgb}{0,0,1}
\newcommand*{\cjkhl}[2]{{\def\xcjklhcolorbox{\colorbox{#1}}\xcjkhl#2\relax}}
\makeatletter
%look ahhead for the next character
\def\xcjkhl{\futurelet\tmp\xxcjkhl}
%helper macro to make leaders with a highlight box.
\def\xcjkhlleaders{\leavevmode\leaders\hbox{%
\fboxsep\z@\xcjklhcolorbox{\strut\kern.1pt%
\ifx\cjkhlbleeda\relax\else\kern\cjkhlbleeda\fi\relax}%
\ifx\cjkhlbleeda\relax\else\kern-\cjkhlbleeda\fi\relax}}
% leaders with a 1pt of stretch/shrink to put before or after punctuation
\def\@@yhlstretch{\leavevmode\xcjkhlleaders\hskip\z@\@plus.1em \@minus.1em }
\def\@chkhlpar#1\fi\fi#2{\par\noindent\xcjkhl}
\def\@cjkhl@beforeafter#1{%
\ifx\tmp#1%
\@@yhlstretch
\let\@chkhlstretch\@@yhlstretch
\let\cjkhlpenalty\@highpenalty
\fi}
\def\@cjkhl@after#1{%
\ifx\tmp#1%
\let\@chkhlstretch\@@yhlstretch
\let\cjkhlpenalty\@highpenalty
\fi}
\def\@cjkhl@before#1{%
\ifx\tmp#1%
\@@yhlstretch
\let\cjkhlpenalty\@highpenalty
\fi}
\def\xxcjkhl{%
%look for a \par (from \obeylines)
\ifx\tmp\par\expandafter\@chkhlpar\fi
%look for a \relax to finish
\ifx\tmp\relax
\else
%by default do no stretch leaders after the character
\let\@chkhlstretch\relax
\let\cjkhlpenalty\z@
%these stretch before and after
\@cjkhl@beforeafter?%
\@cjkhl@beforeafter;%
% these stretch after
\@cjkhl@after,%
\@cjkhl@after。%
\@cjkhl@after)%
\@cjkhl@after》%
\@cjkhl@after”%
%these stretch before
\@cjkhl@before(%
\@cjkhl@before《%
\@cjkhl@before“%
% look for a space
\ifx\tmp\@sptoken
\xxxcjkhlsp
\else
%default case stick the current character in a box
\xxxcjkhl
\fi\fi}
%make a highlight leaders stretch/shrink as much as a normal word space.
\def\xxxcjkhlsp#1\fi\fi#2{%
\fi\fi
\xcjkhlleaders\hskip \fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font\relax
\xcjkhl#2}
%get out of a double \if test
\def\xxxcjkhl\fi\fi{%
\fi\fi
\@chkhl}
%The simple case box the current character and start looking for the next.
% bleed slightly on the right to avoid gaps showing
\let\cjkhlbleeda\relax
\def\cjkhlbleeda{.07pt}
\def\@chkhl#1{{%
\fboxsep\z@
\leavevmode\penalty\cjkhlpenalty
\xcjklhcolorbox{%
\strut#1\ifx\cjkhlbleeda\relax\else\kern\cjkhlbleeda\fi}}%
\ifx\cjkhlbleeda\relax\else\kern-\cjkhlbleeda\fi\relax
\@chkhlstretch
\xcjkhl}%
\makeatother
\begin{document}
本条所说的三日期间与第98条规定的三日期间在计算上采同样的规则(请参考第98条的释义部分),期间的开始均不是以扣押命令的发出为标准,而是以扣押的生效为准。\cjkhl{yellow}{对邮件的扣押,以邮政服务机构收到扣押命令,邮 ; 件开始处于被截留的状态,视为扣押的生效(Pfeiffer S471 Rn4)},期间由此开始。期间的开始计算同样适用第42条的规定。
但与第98条不同的是,第98条的三日期间只是向法官提出追认照准的申请的期间,而本条则是收到法官追认照准的期间。邮政服务机构如果在三日内没收到法官的追认,检察官的扣押命令失效,毋需再向检察官交出邮件。但邮件如果已经被交出的,则暂时不被返还,仍可保留在检察官处。如果在三日期满后法官又追认照准的,视为法官作出了新的扣押命令(Meyer-Goßner S325 Rn7)。
\cjkhl{lightblue}{如果法官在三日内不予照准的呢?如果在三日内没有追认,在三日后也没有作出追认的?如果法官在三日后作出不予照准的呢?六种情况}
\bigskip
\hrule
\bigskip
\obeylines
本条所说的三日期间与第98条规定的三日期间在计算上采同样的规则
(请参考第98条的释义部分),期间的开始均不是以扣押命令的发出为标准,而是以扣押的生效为准。\cjkhl{yellow}{对邮件的扣押,
以邮政服务机构收到扣押命令,邮 ; 件开始处于被截留的状态,
视为扣押的生效(Pfeiffer S471 Rn4)},期间由此开始。期间的开始计算同样适用第42条的规定。
但与第98条不同的是,第98条的三日期间只是向法官提出追
认照准的申请的期间,而本条则是收到法官追认照
准
的期间。邮政服务机构如果在三日内没收到法官的追认,检察官的扣押命令失效,毋需再向检察官交出邮件。但邮件如果已经被交出的,则暂时不被返还,仍可保留在检察官处。如果在三日期满后法官又追认照准的,视为法官作出
了新的扣押命令(Meyer-Goßner S325 Rn7)。
\cjkhl{lightblue}{如果法官在三日内不予照准的呢?如
果在三日内没有追认,在三日后也没有作出追认的?
如果法官在三日后作出不予照准的呢?六种情况}
\end{document}
原始简易版本:
由于这会单独突出显示每个字符,因此会产生次优的字距调整并破坏连字,但这对于突出显示中的任何字母脚本来说可能是一个更大的问题,而不是对于 CJK 字符来说。
用 xelatex 测试过。希望文本没有乱码,否则我看不懂。
\documentclass[nofonts]{ctexbook}
\setCJKmainfont{SimSun}
\newcommand*{\yellowhl}[1]{\xyellowhl#1\relax}
\makeatletter
\def\xyellowhl{\futurelet\tmp\xxyellowhl}
\def\xxyellowhl{%
\ifx\tmp\relax
\else
\ifx\tmp\@sptoken
\xxxyellowhlsp
\else
\xxxyellowhl
\fi\fi}
\def\xxxyellowhlsp#1\fi\fi#2{%
\fi\fi
\leaders\hbox{\fboxsep\z@\colorbox{yellow}{\strut\kern.1pt}}%
\hskip \fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font\relax
\xyellowhl#2}
\def\xxxyellowhl\fi\fi{%
\fi\fi
\@yhl}
\def\@yhl#1{{%
\fboxsep\z@
\leavevmode\penalty\z@\colorbox{yellow}{\strut#1}}%
\xyellowhl}%
\makeatother
\begin{document}
本条所说的三日期间与第98条规定的三日期间在计算上采同样的规则(请参考第98条的释义部分),期间的开始均不是以扣押命令的发出为标准,而是以扣押的生效为准。\yellowhl{对邮件的扣押,以邮政服务机构收到扣押命令,邮件开始处于被截留的状态,视为扣押的生效(Pfeiffer S471 Rn4)},期间由此开始。期间的开始计算同样适用第42条的规定。
但与第98条不同的是,第98条的三日期间只是向法官提出追认照准的申请的期间,而本条则是收到法官追认照准的期间。邮政服务机构如果在三日内没收到法官的追认,检察官的扣押命令失效,毋需再向检察官交出邮件。但邮件如果已经被交出的,则暂时不被返还,仍可保留在检察官处。如果在三日期满后法官又追认照准的,视为法官作出了新的扣押命令(Meyer-Goßner S325 Rn7)。
\yellowhl{如果法官在三日内不予照准的呢?如果在三日内没有追认,在三日后也没有作出追认的?如果法官在三日后作出不予照准的呢?六种情况}
\end{document}
答案2
一个更简单的解决方案:
\documentclass[fntef]{ctexart}
\usepackage{xcolor}
\usepackage{ulem}
\newcommand\hl{\bgroup\markoverwith
{\textcolor{yellow}{\rule[-.5ex]{2pt}{2.5ex}}}\ULon}
\begin{document}
汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字
\hl{汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字
汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字
汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字}
汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字汉字
\end{document}
请注意,fntef
选项是必需的(或用于CJKulem
包CJK
)。