\ pdfstringdef transforme les caractères accentués en séquence d'échappement octale

Oct 18 2020

La question: comment créer un texte brillant?

@ 'Symbol 1', intéressant, j'ai encapsulé votre script dans une nouvelle commande (nommée '\ glow') pour que je puisse surligner le texte comme avec '\ hl {}'. Cependant le résultat de '\ glow {Ceci est un \ hl {test}}' n'était pas satisfaisant du fait que la boîte jaune a été réécrite plusieurs fois au-dessus de l'effet lumineux, le cachant.

J'ai donc essayé de modifier votre solution, d'imprimer d'abord la chaîne d'origine (par exemple avec '\ hl {}'), d'utiliser \ pdfstringdef pour supprimer le formatage et d'obtenir une chaîne propre / simple pour la chaîne lumineuse, puis de l'afficher une dernière fois ci-dessus pour obtenir un texte propre.

Pourtant, \ pdfstringdef transforme les caractères accentués en séquences octales comme on le voit ici:

Comment dépouiller une chaîne de toute mise en forme

Voici une petite version peaufinée avec transparence pour "respecter" les hautes lumières ou autres effets de fond. Pourtant, le problème demeure pour les caractères accentués ou même les parenthèses et autres:

\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}

Btw, j'essaie d'imiter la fonction lumineuse de texte de Word:

Toute solution ?

PS: je ne peux pas ajouter les balises 'latex', ou 'glow' ou 'pdfstringdef' sauf si j'ai 300 "réputation"

EDIT: avec la solution fournie, qui fonctionne en général (les caractères accentués sont rendus correctement) j'obtiens maintenant un effet "feedback". Je devrais enquêter. "Pas si élémentaire, mon cher Watson".

Réponses

3 UlrikeFischer Oct 18 2020 at 21:38

Essayez avec \text_purify:n(nécessite un système de texte assez actuel!)

\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}

Kochise Oct 22 2020 at 14:56

Juste un petit mot sur 'xspace', même si je sais que c'est un "mal nécessaire" dans de nombreux cas, tout comme dans le mien. Le nom du projet est intégré dans une macro afin que le changement du nom du projet soit simple (remplacez le contenu de la macro et voilà). Mais étant une macro, les espaces suivants sont détruits dans l'oubli. Bien que ce ne soit pas un problème avant une ponctuation, cela devient confus à l'intérieur d'une phrase lorsque deux mots adjacents sont collés ensemble sans raison (même si nous pouvons toujours trouver une raison valable d'une manière ou d'une autre, comme l'alignement planétaire, etc.).

Quoi qu'il en soit, j'ai créé un petit MWE qui démontre que c'est vraiment le décapage du 'xspace' qui a provoqué "l'effet de rétroaction étrange". Et maintenant, un autre pas de géant pour l'humanité ...

(Btw, j'ai également modifié les paramètres de couleur / transparence et je pense que je l'ai cloué, ressemble beaucoup plus à l'éclat de Word, et plus de saignement de couleur: "Yeah Baby, Yeah!")

\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}