Wort beim ersten Auftreten highlighten

Schriftbild, Absätze und Auflistungen einstellen


DEVV
Forum-Century
Forum-Century
Beiträge: 117
Registriert: Sa 31. Okt 2015, 17:06

Wort beim ersten Auftreten highlighten

Beitrag von DEVV »

Hallo Leute,

ich möchte, dass ein Befehl beim ersten Auftreten anders funktioniert, als beim zweiten oder dritten.

Dabei handelt es sich um \emph.
Ich möchte, dass \emph{WORT} ein Wort beim ersten Auftreten kursiv und fett schreibt, im folgenden soll es aber nur noch kursiv geschrieben werden.

Ist soetwas möglich?

Viele Grüße
D

DEVV
Forum-Century
Forum-Century
Beiträge: 117
Registriert: Sa 31. Okt 2015, 17:06

Beitrag von DEVV »

Nach viel Googler-Rei hab ichs hinbekommen:
\usepackage{etoolbox}
\renewcommand{\emph}[1]{\ifcsundef{#1}{\csdef{#1}{}\textbf{\textit{#1}}}{\textit{#1}}}
Das funktioniert recht gut, leider klappt die Methode nicht, wenn man die \_ Implementierung aus normaler-unterstrich-t22350.html verwenden möchte :(

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

Deine Änderung des Befehls \emph führt bei mir nicht zu dem erwarteten Ergebnis und ist außerdem fragwürdig, weil er den Text nicht einfach nur neigt, sondern, bei verschachtelter Anwendung, die Neigung wieder aufheben kann.

Theoretisch müsstest Du eher den Befehl \eminnershape anpassen.

Ich finde es in diesem Zusammenhang besser, einen eigenen Befehl für diese besondere Art der Hervorhebung anzulegen.

Mein Beispiel orientiert sich an der Antwort von Alan Munn.
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{etoolbox}
\usepackage{relsize}% für \textscale

\newcommand{\wordlist}{}

\newcommand{\emphasize}[1]{%
    \ifinlist{#1}{\wordlist}{%
        \emph{#1}%
    }{%
        \listadd{\wordlist}{#1}%
        \textbf{\emph{#1}}%
    }%
}

\begin{document}
\emphasize{S.root\_array} \emphasize{S.root\_array} \emphasize{S.root\_array}
\emphasize{S.r[i].lx\_top} \emphasize{S.r[i].lx\_top} \emphasize{S.r[i].lx\_top}

\smallskip
\renewcommand{\wordlist}{}
\renewcommand{\_}{\textscale{.7}{\textunderscore}}
\emphasize{S.root\_array} \emphasize{S.root\_array} \emphasize{S.root\_array}
\emphasize{S.r[i].lx\_top} \emphasize{S.r[i].lx\_top} \emphasize{S.r[i].lx\_top}

\smallskip
\renewcommand{\wordlist}{}
\renewcommand{\_}{\rule[-1pt]{5pt}{0.5pt}}
\emphasize{S.root\_array} \emphasize{S.root\_array} \emphasize{S.root\_array}
\emphasize{S.r[i].lx\_top} \emphasize{S.r[i].lx\_top} \emphasize{S.r[i].lx\_top}
\end{document}

Gast

Beitrag von Gast »

DEVV hat geschrieben:Das funktioniert recht gut, leider klappt die Methode nicht, wenn man die \_ Implementierung aus normaler-unterstrich-t22350.html verwenden möchte :(
Wie dort erklärt, ist \_ normalerweise vom verwendeten Font abhängig, weil es das Zeichen aus dem entsprechenden Font verwendet. Definiert man nun \_ zu einer Rule fester Höhe, Tiefe und Breite um, wird das natürlich unabhängig vom Font und daher auch nicht mit dem Font dicker oder dünner und berücksichtigt auch keine Schrägstellung und auch Kerning und in der gezeigten Form nicht einmal die Größe des Fonts. Daher müsste man min. auf Basis der Einheit ex oder em statt pt definieren (um die Abhängigkeit von der Schriftgröße zu bekommen) und ggf. auch noch auf diverse Schriftattribute testen (siehe dazu die \f@…-Makros im fntguide).

Aus all diesen Gründen ist es häufig einfacher (und nicht selten auch besser), sich entweder auf den Fontdesigner zu verlassen und Zeichen zu verwenden, wie der Fontdesigner das vorgesehen hat, oder einen Font zu wählen, bei dem einem alle Zeichen zusagen. In dem Fall zeigt dann Bartman's Antwort sehr schön, wie man die Anforderung einer neuen Hervorhebungsart lösen kann.

DEVV
Forum-Century
Forum-Century
Beiträge: 117
Registriert: Sa 31. Okt 2015, 17:06

Beitrag von DEVV »

Bartman hat geschrieben:Deine Änderung des Befehls \emph führt bei mir nicht zu dem erwarteten Ergebnis und ist außerdem fragwürdig, weil er den Text nicht einfach nur neigt, sondern, bei verschachtelter Anwendung, die Neigung wieder aufheben kann.

Theoretisch müsstest Du eher den Befehl \eminnershape anpassen.
Ich muss zugeben, dass ich deine gesamte Antwort nicht verstehe.
1. Wieso verhält sich \emph bei mir anders, als bei dir? Oder hast du einen Sonderfall gefunden, in dem \emph nicht funktioniert?
2. Wann genau hebt \emph Kursivität wieder auf?

Eine Verarschachtelte Anwendung wäre laut meiner eigenen Definition einfach ein Anwendungsfehler. Ich wüsste nicht, wieso ich schachtelt sollte...

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

DEVV hat geschrieben:1. Wieso verhält sich \emph bei mir anders, als bei dir? Oder hast du einen Sonderfall gefunden, in dem \emph nicht funktioniert?
Die Übersetzung mit pdfLaTeX wirft bei meiner MiKTeX-Distribution des 1. Oktober (ein Update scheint gegenwärtig nicht möglich zu sein) ebenso wie bei TeX Live 2017 von Overleaf mit dem Beispiel
\documentclass{scrartcl}
\usepackage{etoolbox}

\renewcommand{\emph}[1]{\ifcsundef{#1}{\csdef{#1}{}\textbf{\textit{#1}}}{\textit{#1}}}

\begin{document}
Text \emph{Te\_xt} Text
\end{document}
die Fehlermeldung
! Missing \endcsname inserted.
<to be read again> 
                   \protect 
l.7 Text \emph{Te\_xt}
                       Text
DEVV hat geschrieben:2. Wann genau hebt \emph Kursivität wieder auf?
Was ist der Unterschied zwischen \emph{} und \textit{}?

Der Nutzer Mico hat den für den Befehl \emph wesentlichen Quelltext aus dem LaTeX-Kern der Datei latex.ltx entnommen und zusammengefasst:
\DeclareTextFontCommand{\emph}{\em}
\DeclareRobustCommand\em
        {\@nomath\em \ifdim \fontdimen\@ne\font >\z@
                       \eminnershape \else \itshape \fi}%
\def\eminnershape{\upshape}%
Man findet die Datei im MiKTeX-Ordner unter dem Pfad tex\latex\base.

DEVV
Forum-Century
Forum-Century
Beiträge: 117
Registriert: Sa 31. Okt 2015, 17:06

Beitrag von DEVV »

Ich habe ja bereits angesprochen, dass es ein Problem mit \_ geben könnte.

Aber bisher ist das gefundene die beste Version.

Warum mich jetzt stören sollte, das \textit anders funktioniert als \emph weiß ich nicht ganz, denn ich möchte ja einfach nur erreichen, dass meine getaggten Wörter beim ersten Auftreten fett und kursiv und bei jedem weiteren Auftreten nur noch kursiv geschrieben werden.

Antworten