Seite 1 von 1
Wort beim ersten Auftreten highlighten
Verfasst: Sa 19. Okt 2019, 23:17
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
Verfasst: So 20. Okt 2019, 05:37
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

Verfasst: So 20. Okt 2019, 09:40
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}
Verfasst: So 20. Okt 2019, 10:58
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.
Verfasst: So 20. Okt 2019, 14:33
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...
Verfasst: So 20. Okt 2019, 18:56
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.
Verfasst: So 20. Okt 2019, 19:35
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.