有没有什么解决方案可以突出显示 CJK 文本?

有没有什么解决方案可以突出显示 CJK 文本?

有没有什么办法可以突出显示中文、日语和韩语的文本或句子?目前我还不知道。

但如果有人愿意帮助我使用 LaTeX 中的 CJK,这种情况就会改变。

问题:

  1. 如果使用 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 文件,突出显示的文本将变成黑色方块。

    在此处输入图片描述

  2. 如果使用基于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选项是必需的(或用于CJKulemCJK)。

在此处输入图片描述

也可以看看:https://tex.stackexchange.com/a/48549/2674

相关内容