\pdfstringdef 将重音字符转换为八进制转义序列

\pdfstringdef 将重音字符转换为八进制转义序列

问题:如何制作发光的文字?

@'Symbol 1',有趣的是,我将您的脚本封装到一个新的命令(名为“​​\glow”)中,这样我就可以像使用“\hl{}”一样突出显示文本。然而,“\glow{This is a \hl{test}}”的结果并不令人满意,因为发光效果上方的黄色框被多次重写,将其隐藏起来。

因此,我尝试修改您的解决方案,首先打印原始字符串(例如,使用 '\hl{}'),使用 \pdfstringdef 删除格式并获取发光字符串的干净/纯文本,然后最后一次显示它以获取干净的文本。

然而 \pdfstringdef 将重音字符转换为八进制序列,如下所示:

如何去除字符串的所有格式

这是一个经过稍微调整的版本,它具有透明度,可以“尊重”突出显示或其他背景效果。然而,对于重音字符甚至括号等,问题仍然存在:

glow_preserving_highlight

\documentclass{article}

\usepackage{tikz}               % Graphique
\usepackage{transparent}        % Transparence
%\usepackage[outline]{contour}  % Contour

\usepackage{xcolor}             % Couleurs par nom

\usepackage{soul}               % \hl{}
\usepackage{hyperref}           % \pdfstringdef

% =============================================================================
\makeatletter   % Autorise la modification des macros système
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

% /!\ UTILISATION DE 'PDFSTRINGDEF' POUR 'NETTOYER' LE TEXTE
\newcommand{\glow}[2]{
        % Début liste de 'nettoyage' (rajouter les commandes à 'nettoyer')
        \pdfstringdefDisableCommands{\def\hl{}} % Nettoyage de '\hl{#1}'
        % Fin liste de 'nettoyage'
        \pdfstringdef\plainstr{#2}  % Extraction chaine 'nettoyée'
%       #2%i                        % Texte avec mise en forme (fond) NOK
        \leavevmode                 % Mode horizontal (pas de passage à la ligne implicite)
        \pgfsys@beginscope          % = pdfliteral{q}
            \rlap{#2}%i             % Texte avec mise en forme (fond) 1x
            \pgfsetroundjoin        % = pdfliteral{1 j}
            \pgfsetroundcap         % = pdfliteral{1 J}
            \pdfliteral{1 Tr}%i     % no pgf alternative
            \foreach\ind in {10, ..., 1}{%i
                    \pgfmathsetmacro\per{(11-\ind)*5}%i
\iffalse
                        % Couleur décroissante
                        \color{#1!\per}%
\else
                        % Transparence cumulée
                        \color{#1}%
                        \transparent{0.1}%              % 10% max
\fi
\iftrue
                        % Contour 'léger'
                        \pgfsetlinewidth{\ind/2}        % light
\else
                        % Contour 'épais'
                        \pgfsetlinewidth{(\ind/2)+1}    % heavy
\fi
%                   \rlap{#2}%i                         % x fois COULEUR avec mise en forme NOK
                    \rlap{\plainstr}%i                  % x fois COULEUR sans mise en forme
                }%i
        \pgfsys@endscope            % = pdfliteral{Q}
        \plainstr                   % Texte sans mise en forme (dessus) NOIR
%       #2%i                        % Texte avec mise en forme (dessus) NOIR
    }

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\makeatother    % Bloque la modification des macros système
% =============================================================================

\begin{document}

COMPILE AT LEAST TWICE !!!

This is a test.

This is another \hl{test}.

\glow{green}{This one is supposed to glow without highlight.}

\glow{cyan}{This one is also supposed to \hl{glow} preserving the highlight.}

pdfstringdefDisableCommands and pdfstringdef removes the formatting.

Then I overwrite the glowing string with a clean black string without hl{}.

\glow{orange}{But accented characters are a hell to deal with.}

\glow{red}{Bùt àccéntèd charaçters are a hell to deal wïth.}

Even parenthesis gets "destroyed" in the process...

\end{document}

顺便说一句,我正在尝试模仿 Word 的文本发光功能:

glow_highlight_using_word

有什么解决办法吗?

PS:除非我有 300 个“声誉”,否则我无法添加标签“latex”或“glow”或“pdfstringdef”

编辑:使用提供的解决方案,总体上有效(重音字符正确呈现),我现在得到了“反馈”效果。我应该调查一下。“不是那么简单,亲爱的华生。”

glow_preserving_highlight_feedback

答案1

尝试\text_purify:n(需要相当先进的文本系统!)

\documentclass{article}

\usepackage{tikz}               % Graphique
\usepackage{transparent}        % Transparence
%\usepackage[outline]{contour}  % Contour

\usepackage{xcolor}             % Couleurs par nom

\usepackage{soul}               % \hl{}
\usepackage{hyperref}           % \pdfstringdef

% =============================================================================
\makeatletter   % Autorise la modification des macros système
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

\ExplSyntaxOn
\cs_set_eq:NN\textpurify\text_purify:n
\ExplSyntaxOff
% /!\ UTILISATION DE 'PDFSTRINGDEF' POUR 'NETTOYER' LE TEXTE
\newcommand{\glow}[2]{
        % Début liste de 'nettoyage' (rajouter les commandes à 'nettoyer')
        %\pdfstringdefDisableCommands{\def\hl{}} % Nettoyage de '\hl{#1}'
        % Fin liste de 'nettoyage'
        \edef\plainstr{\textpurify{#2}}  % Extraction chaine 'nettoyée'
%       #2%i                        % Texte avec mise en forme (fond) NOK
        \leavevmode                 % Mode horizontal (pas de passage à la ligne implicite)
        \pgfsys@beginscope          % = pdfliteral{q}
            \rlap{#2}%i             % Texte avec mise en forme (fond) 1x
            \pgfsetroundjoin        % = pdfliteral{1 j}
            \pgfsetroundcap         % = pdfliteral{1 J}
            \pdfliteral{1 Tr}%i     % no pgf alternative
            \foreach\ind in {10, ..., 1}{%i
                    \pgfmathsetmacro\per{(11-\ind)*5}%i
\iffalse
                        % Couleur décroissante
                        \color{#1!\per}%
\else
                        % Transparence cumulée
                        \color{#1}%
                        \transparent{0.1}%              % 10% max
\fi
\iftrue
                        % Contour 'léger'
                        \pgfsetlinewidth{\ind/2}        % light
\else
                        % Contour 'épais'
                        \pgfsetlinewidth{(\ind/2)+1}    % heavy
\fi
%                   \rlap{#2}%i                         % x fois COULEUR avec mise en forme NOK
                    \rlap{\plainstr}%i                  % x fois COULEUR sans mise en forme
                }%i
        \pgfsys@endscope            % = pdfliteral{Q}
        \plainstr                   % Texte sans mise en forme (dessus) NOIR
%       #2%i                        % Texte avec mise en forme (dessus) NOIR
    }

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\makeatother    % Bloque la modification des macros système
% =============================================================================

\begin{document}

COMPILE AT LEAST TWICE !!!

This is a test.

This is another \hl{test}.

\glow{green}{This one is supposed to glow without highlight.}

\glow{cyan}{This one is also supposed to \hl{glow} preserving the highlight.}

pdfstringdefDisableCommands and pdfstringdef removes the formatting.

Then I overwrite the glowing string with a clean black string without hl{}.

\glow{orange}{But accented characters are a hell to deal with.}

\glow{red}{Bùt àccéntèd charaçters are a hell to deal wïth.}

Even parenthesis gets "destroyed" in the process...

\end{document}

在此处输入图片描述

答案2

关于“xspace”的简短说明,尽管我知道在很多情况下,它都是“必要之恶”,就像我自己的情况一样。项目名称嵌入在宏中,因此更改项目名称很简单(替换宏内容即可)。但是作为宏,后面的空格会被彻底删除。虽然在标点符号之前没有问题,但当两个相邻的单词毫无理由地粘在一起时,句子内部就会变得混乱(尽管我们总能以某种方式找到有效的原因,例如行星排列等)。

无论如何,我创建了一个小 MWE,证明了正是剥离“xspace”导致了“奇怪的反馈效应”。现在,人类又向前迈进了一大步……

(顺便说一句,我还调整了颜色/透明度设置,我认为我成功了,看起来更像 Word 的发光,并且不再有颜色渗色:“Yeah Baby,Yeah!”)

发光净化器.png

\documentclass{article}

\usepackage{tikz}               % Graphique
\usepackage{transparent}        % Transparence

\usepackage{xcolor}             % Couleurs par nom
\usepackage{soul}               % \hl{}

\usepackage{xspace}             % Gestion des espaces

\def\test{\hl{test}\xspace}     % <<--- THE MACRO !!!

% =============================================================================
\makeatletter   % Autorise la modification des macros système
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

\ExplSyntaxOn
\cs_set_eq:NN\textpurify\text_purify:n
\ExplSyntaxOff
% /!\ UTILISATION DE 'TEXT_PURIFY' POUR 'NETTOYER' LE TEXTE
\newcommand{\glow}[2]{
        \edef\plainstr{\textpurify{#2}}  % Extraction chaine 'nettoyée'
%       #2%i                        % Texte AVEC mise en forme (fond) (NOK)
        \leavevmode                 % Mode horizontal (pas de passage à la ligne implicite)
        \pgfsys@beginscope          % = pdfliteral{q}
            \rlap{#2}%i             % Texte AVEC mise en forme (fond) 1x
            \pgfsetroundjoin        % = pdfliteral{1 j}
            \pgfsetroundcap         % = pdfliteral{1 J}
            \pdfliteral{1 Tr}%i     % no pgf alternative
            \foreach\ind in {10, ..., 1}{%i
                    \pgfmathsetmacro\per{(11-\ind)*5}%i
                    \color{#1!\per}%                % Couleur décroissante
                    \transparent{0.2}%              % Transparence cumulée
\iftrue
                    \pgfsetlinewidth{\ind/2}        % Contour 'léger'
\else
                    \pgfsetlinewidth{(\ind/2)+1}    % Contour 'épais'
\fi
%                   \rlap{#2}%i                     % x fois COULEUR AVEC mise en forme (NOK)
                    \rlap{\plainstr}%i              % x fois COULEUR sans mise en forme
                }%i
        \pgfsys@endscope            % = pdfliteral{Q}
%       #2%i                        % Texte AVEC mise en forme (dessus) NOIR
        \plainstr                   % Texte sans mise en forme (dessus) NOIR
    }

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
\makeatother    % Bloque la modification des macros système
% =============================================================================

\begin{document}

COMPILE AT LEAST TWICE !!!

This is a \hl{test}.

This is another \test with a macro instead.

\glow{green}{This test is sùpposed to glow without highlight.}

\glow{cyan}{This \hl{test} is sûpposed to glow preserving the highlight.}

\glow{cyan}{This \test macro featüres a xspace that is context dependant.}

However text\_purify seems to be overzealous and "purify" it.

\end{document}

相关内容