.png)
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}}
}
shaded
Beim Unterstreichen innerhalb von Umgebungen (aus dem Paket) bleibt die Weiße um die Buchstaben herum jedoch framed
bestehen. 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 shaded
Umgebungen überhaupt nicht mehr funktionierte.
Wie kann ich zwei verschiedene Farbwerte haben, \contour
ohne 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 white
Hintergrund erstelle ich einen white
Rand um Buchstaben, damit die Unterstreichung die Buchstaben nicht schneidet. Das funktioniert gut. Aber auf einem shadedcolor
Hintergrund 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
- Offenbar habe ich vergessen zu erwähnen, wie weit unten/oben ich die Unterstreichung haben möchte:
\renewcommand{\ULdepth}{1.8pt}
\contourlength{0.8pt}
- Und ich habe vergessen zu erwähnen, dass ich auch die Pakete
framed
und verwende:color
\usepackage{framed,color}
\definecolor{shadecolor}{rgb}{.827451,.827451,.827451}
- 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 \ul
wird nicht mehr \relax
angezeigt, 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):
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 contour
das 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 ulem
Paket standardmäßig Folgendes tut (was völlig in Ordnung ist):
Und es gibt zwei Parameter, die die Linienstärke steuern, über \ULthickness
:
und Tiefe, über \ULdepth
:
In der Dokumentation steht, dass der Standardwert für \ULdepth
ist \maxdimen
, der sich mit der Schriftart ändert. Wenn also etwas \maxdimen
auf einen kleinen oder Nullwert (oder keinen Wert) (zurück) gesetzt wird und/oder Setzen \ULdepth
keine verfügbare Aktion ist, um die Unterstreichung wieder nach unten zu drücken (beispielsweise wird der Befehl \relax
von 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- ulem
Umgehung gesucht wird, kommen wir zu Wie, das contour
ins 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 ulem
zuerst 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:
Contour
und ulem
funktionieren perfekt mit den verschiedenen Farben:
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 d
s 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 \ul
verwenden :shaded
nicht die, die Sie beabsichtigen.
Tipp: Identifizieren Sie die Umgebung, in der der \checkenvcommands
Befehl 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 \ul
Umfang auf diese Umgebung zu beschränken. Wenn Sie alle diese Änderungen vorgenommen haben, ist das Ergebnis:
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}
framed
Wenn Sie die Paketumgebung neu definieren möchten shaded
, sollte dies eine separate Frage sein.
=====
Bearbeiten
Als Referenz etoolbox
bietet 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 contour
einrichtet, dass er im Outline-Modus unter xelatex läuft (tatsächlich werden PDF-Literale über den \special
Befehl xdvipdfmx an die Ausgabe übergeben), contour
hat 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“.