Konturfarbe neu definieren (für Unterstreichungen)

Konturfarbe neu definieren (für Unterstreichungen)

Ich verwende den folgenden Code (entnommen ausDiese Seitefür die schönen Unterstreichungen unter meinem Text.

\usepackage{ulem}
\usepackage{contour}

\renewcommand{\ULdepth}{1.8pt}
\contourlength{0.8pt}

\newcommand{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{white}{#1}}
}

shadedBeim Unterstreichen innerhalb von Umgebungen (aus dem Paket) bleibt die Weiße um die Buchstaben herum jedoch framedbestehen. Um dies zu beheben, dachte ich, ich würde das Folgende unter dem obigen Code hinzufügen:

\makeatletter

\def\ifenv#1{
   \def\@tempa{#1}%
   \ifx\@tempa\@currenvir
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
   \fi
}

\makeatother

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
{
    \tl_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
    \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
    \exp_args:Nc \newcommand { w envc_#1_\cs_to_str:N #2 }
}
\NewDocumentCommand{\checkenvcommands}{ }
{
    \tl_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
    {
        \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
        {
            \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 }
        }
    }
}
\ExplSyntaxOff

%--Taking the bit below out restores normal underlining
\newenvcommand{shaded}{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{shadedcolor}{#1}}
}

Es stellte sich heraus, dass es nicht funktionierte. Es führte sogar dazu, dass die normale Unterstreichung außerhalb der shadedUmgebungen überhaupt nicht mehr funktionierte.

Wie kann ich zwei verschiedene Farbwerte haben, \contourohne dass sie miteinander in Konflikt geraten?

MWE:

\documentclass[a4paper,12pt]{report}

%-- Underline:

\usepackage{ulem}
\usepackage{contour}

\renewcommand{\ULdepth}{1.8pt}
\contourlength{0.8pt}

\newcommand{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{white}{#1}}
}

%-- Shaded environment:

\usepackage{framed,color}

\definecolor{shadecolor}{rgb}{.827451,.827451,.827451}

%-- Local commands:

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
{
    \tl_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
    \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
    \exp_args:Nc \newcommand { w envc_#1_\cs_to_str:N #2 }
}
\NewDocumentCommand{\checkenvcommands}{ }
{
    \tl_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
    {
        \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
        {
            \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 }
        }
    }
}
\ExplSyntaxOff

%--Taking the bit below out restores normal underlining
\newenvcommand{shaded}{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{shadedcolor}{#1}}
}

\begin{document}

\ul{Test outside shaded.} %--Works if I take out the \newenvcommand{shaded}{\ul}[1]{…} bit, fails when I put it back.

\begin{shaded}
    \ul{Test inside shaded.} %--Displays white edge if I take out the \newenvcommand{shaded}{\ul}[1]{…} bit, fails when I put it back.
\end{shaded}

\end{document}

Ich weiß, was der Befehl macht. Auf einem whiteHintergrund erstelle ich einen whiteRand um Buchstaben, damit die Unterstreichung die Buchstaben nicht schneidet. Das funktioniert gut. Aber auf einem shadedcolorHintergrund möchte ich diesen Rand ändern, damit er dazu passt shadedcolor. Es geht darum, hässliche Schnitte in Buchstaben zu vermeiden, die unter die Unterstreichung gehen.

\newenvcommand{shaded}{\ul}[1]Das Problem ist nur, dass alles nicht mehr funktioniert, wenn ich den Befehl für eine bestimmte Umgebung ändere .


EDIT: Habe vergessen, Code einzufügen

  1. Offenbar habe ich vergessen zu erwähnen, wie weit unten/oben ich die Unterstreichung haben möchte:
\renewcommand{\ULdepth}{1.8pt}
\contourlength{0.8pt}
  1. Und ich habe vergessen zu erwähnen, dass ich auch die Pakete framedund verwende:color
\usepackage{framed,color}

\definecolor{shadecolor}{rgb}{.827451,.827451,.827451}
  1. Vielleicht ist auch dies erwähnenswert:
\makeatletter

\def\ifenv#1{
   \def\@tempa{#1}%
   \ifx\@tempa\@currenvir
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
   \fi
}

\makeatother

Alle diese Änderungen wurden nun dem obigen Code hinzugefügt. Wir entschuldigen uns für die Unannehmlichkeiten.

Antwort1

Keine Antwort, eher ein Kommentar mit Bild:

Das lokal definierte \ulwird nicht mehr \relaxangezeigt, wenn @egregs expl3-Code aus kopiert und eingefügt wirdDefinieren von Befehlen, die auf eine bestimmte Umgebung beschränkt sindgenau, was zu diesem Ergebnis führt (außerhalb der Umgebung = rot; innerhalb der Umgebung = blau):

Testunterstreichung mit Kontur

MWE

\documentclass[a4paper,12pt]{report}
\newcommand\textdescenders{pqrgym}
\usepackage{ulem}
\usepackage{contour}

\newcommand{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{red}{#1}}
}

%%\usepackage{xparse}
%%
%%\ExplSyntaxOn
%%\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
%%{
%%    \tl_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
%%    \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
%%    \exp_args:Nc \newcommand { w envc_#1_\cs_to_str:N #2 }
%%}
%%\NewDocumentCommand{\checkenvcommands}{ }
%%{
%%    \tl_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
%%    {
%%        \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
%%        {
%%            \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 }
%%        }
%%    }
%%}
%%\ExplSyntaxOff

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
  {
   \cs_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
   \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
   \exp_after:wN \newcommand \cs:w envc_#1_\cs_to_str:N #2 \cs_end:
  }
\NewDocumentCommand{\checkenvcommands}{ }
  {
   \cs_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
     {
      \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
        { \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 } }
     }
  }
\ExplSyntaxOff

%--Taking the bit below out restores normal underlining
\newenvcommand{shaded}{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{blue}{#1}
%  \uline{#1}\\
%  \contour{blue}{#1}
  }
}

\newenvironment{shaded}{\checkenvcommands}{}

%\input{the-above-code.tex}
\contourlength{0.6pt}

\begin{document}
\Huge
{\normalsize  \textbackslash uline as is: }

\uline{Test outside shaded. \textdescenders}
\vspace{2ex}

{\normalsize  \textbackslash ul with \texttt{contour:}} 

\ul{Test outside shaded. \textdescenders}

{\normalsize  environment \texttt{shaded} with local \textbackslash ul:} 

\begin{shaded}
%\show\ul
    \ul{Test inside shaded. \textdescenders } %--Displays white edge if I take out the \newenvcommand{shaded}{\ul}[1]{…} bit, fails when I put it back.
\end{shaded}

\end{document}

Ich verstehe immer noch nicht, warum contourdas nötig ist oder welche Auswirkungen es haben könnte, da der Konturhalo nicht einmal weit genug reicht, um die Linie zu beeinflussen. Aber das hat nichts damit zu tun.

Der Code von egreg ist immer interessant.


Bearbeitet, um hinzuzufügen:

Ah, ich glaube, ich habe herausgefunden, warum mir die Hintergrundumstände der Frage so bizarr vorkommen: Das liegt daran, dass das ulemPaket standardmäßig Folgendes tut (was völlig in Ordnung ist):

ulem Standard

Und es gibt zwei Parameter, die die Linienstärke steuern, über \ULthickness:

Dicke der Ulem-Uline

und Tiefe, über \ULdepth:

ulem uline Tiefe

In der Dokumentation steht, dass der Standardwert für \ULdepthist \maxdimen, der sich mit der Schriftart ändert. Wenn also etwas \maxdimenauf einen kleinen oder Nullwert (oder keinen Wert) (zurück) gesetzt wird und/oder Setzen \ULdepthkeine verfügbare Aktion ist, um die Unterstreichung wieder nach unten zu drücken (beispielsweise wird der Befehl \relaxvon etwas Wichtigerem (und bisher nicht Angegebenem) ausgeführt), dann wird die Unterstreichung durch die Unterstreichungen gehen, wie in den Kommentaren beschrieben. Wenn dann wiederum nach einer Nicht- ulemUmgehung gesucht wird, kommen wir zu Wie, das contourins Bild kommen könnte (tatsächlich gibt es alte Fragen/Antworten zu diesem Punkt).

Einfach (falls das passiert ist).

Ich dachte, ich hätte vielleicht eine andere Version von ulem, aber da das letzte Update im Jahr 2011 war, scheint das unwahrscheinlich.

Aus logistischen Gründen würde ich dazu neigen, mit ulemzuerst zu beginnen, anstatt mit der Übernahme (eines) weiterer Pakete zu beginnen, einfach wegen der impliziten Abhängigkeiten, die durch diese zweite Methode in die Wartung der Lösung eingebettet werden. Dies ist jedoch eine andere Frage und hat damit nichts zu tun.


Bearbeiten 2:

Contourund ulemfunktionieren perfekt mit den verschiedenen Farben:

ohne die Umgebungen

Wenn Sie den Code von egreg zum Festlegen von Befehlen innerhalb von Umgebungen verwenden möchten, müssen Sie drei Dinge tun: (1) Überprüfen Sie, ob beim Kopieren von „over“ Tippfehler aufgetreten sind, egal wo „over“ steht – z. B. wie viele ds gibt es in den Namen?; (2) verwenden Sie den Code von egregCode, da die verlinkte Frage eine gute Quelle ist; und (3) tatsächlichverwendender Code – etwas zu definieren ist nur der erste Schritt.

Aus Ihrer Codierung geht hervor, dass Sie in der Umgebung Folgendes \ulverwenden :shaded

nicht das eine

nicht die, die Sie beabsichtigen.

Tipp: Identifizieren Sie die Umgebung, in der der \checkenvcommandsBefehl tatsächlich verwendet wird.

Am einfachsten ist es, den Code von egreg aus der verlinkten Frage zu kopieren, Ihre Umgebung zu definieren, die diesen Code verwendet, und dann den \ulUmfang auf diese Umgebung zu beschränken. Wenn Sie alle diese Änderungen vorgenommen haben, ist das Ergebnis:

Egreg-Code-Umgebung

MWE:

\documentclass[a4paper,12pt]{report}

\newcommand\testdescenders{pqgrym}

\usepackage{ulem}
\usepackage{contour}

\renewcommand{\ULdepth}{1.8pt}
\contourlength{0.8pt}

\newcommand{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{white}{#1}}
}

%-- Shaded environment:

\usepackage{framed,xcolor}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
  {
   \cs_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
   \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
   \exp_after:wN \newcommand \cs:w envc_#1_\cs_to_str:N #2 \cs_end:
  }
\NewDocumentCommand{\checkenvcommands}{ }
  {
   \cs_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
     {
      \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
        { \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 } }
     }
  }
\ExplSyntaxOff


\definecolor{shadecolor}{rgb}{.6,.8,.9}

\newenvcommand{xshaded}{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{shadecolor}{#1}}
}


\newenvironment{xshaded}{\checkenvcommands\begin{shaded}}{\end{shaded}}


\begin{document}

\ul{Test outside shaded \testdescenders .}
\begin{xshaded}
    \ul{Test inside shaded \testdescenders .} 
\end{xshaded}


\end{document}

framedWenn Sie die Paketumgebung neu definieren möchten shaded, sollte dies eine separate Frage sein.

=====

Bearbeiten

Als Referenz etoolboxbietet das Paket eine Möglichkeit zum Patchen vorhandener Umgebungen, sodass sich der Code wie folgt vereinfacht:

MWE

\documentclass[a4paper,12pt]{report}

\newcommand\testdescenders{pqgrym}

\usepackage{ulem}
\usepackage{contour}%default: copies mode; default # copies = 16

%bring the underline nearer to the baseline
\renewcommand{\ULdepth}{1.8pt}
%set a small width of the halo around the text
\contourlength{0.8pt}

%underline is drawn first, then the overlapping text
%white: assumes page colour is white
\newcommand{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{white}{#1}}
}

% framed provides shaded environment:
\usepackage{framed}
\usepackage{xcolor}
\definecolor{shadecolor}{rgb}{.85,.9,.95}


%define command to define local-scope command and repoint environment to local token-list
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newenvcommand}{ m m } % #1 = env name, #2 = command name
  {
   \cs_if_exist:cF { g_envc_#1_list_tl } { \tl_new:c { g_envc_#1_list_tl } }
   \tl_gput_right:cn { g_envc_#1_list_tl } { #2 }
   \exp_after:wN \newcommand \cs:w envc_#1_\cs_to_str:N #2 \cs_end:
  }
\NewDocumentCommand{\checkenvcommands}{ }
  {
   \cs_if_exist:cT { g_envc_\use:c {@currenvir} _list_tl }
     {
      \tl_map_inline:cn { g_envc_\use:c {@currenvir} _list_tl }
        { \cs_set_eq:Nc ##1 { envc_\use:c {@currenvir} _\cs_to_str:N ##1 } }
     }
  }
\ExplSyntaxOff


%define a local command \ul for framed's shaded environment
\newenvcommand{shaded}{\ul}[1]{%
  \uline{\phantom{#1}}%
  \llap{\contour{shadecolor}{#1}}
}


%patch framed's shaded environment to check for local commands
\usepackage{etoolbox}
\AtBeginEnvironment{shaded}{\checkenvcommands}




\begin{document}

\ul{Test outside shaded \testdescenders .}
\begin{shaded}
    \ul{Test inside shaded \testdescenders .} 
\end{shaded}


\end{document}

Unabhängig davon: Wenn Zeit eine Rolle spielt, wird kompilierbarer Code, der das Problem veranschaulicht (ein MWE), wahrscheinlich schneller eine Antwort generieren, und zwar im Bereich von 6 Minuten bis 6 Stunden (P> 0,90) und nicht der 6-Tage-6-Wochen-Bereich (P< 0,10) – oder nie –, wie es bei einem fehlerhaften Satz zufälliger Codefragmente jemals der Fall wäre.

Da ich jedoch zuvor (langsam) herausgefunden hatte, wie man den Patch so contoureinrichtet, dass er im Outline-Modus unter xelatex läuft (tatsächlich werden PDF-Literale über den \specialBefehl xdvipdfmx an die Ausgabe übergeben), contourhat das Interesse an der hier beschriebenen Anwendung zu einer Menge Lernen und Wissen geführt, und zwar gerade wegen „einer Reihe fehlerhafter zufälliger Codeschnipsel“.

verwandte Informationen