2
1

Hallo,

wenn ich Abkürzungen automatisieren möchte, kann ich das mit Hilfe z.B. von

Open in writeLaTeX
\usepackage[nonumberlist,acronym]{glossaries}

Ich möchte jetzt mit dem Paket

Open in writeLaTeX
\usepackage{soul}

Textstellen einmalig bei der Erstnennung hervorheben.

Frage: 1. Wie geht das generell? Ich könnte z.B. anstelle von \so{Test} auch andere Mechanismen wie Anführungszeichen etc. verwenden. 2. Wie geht das mit dem Paket soul?

gefragt 28 Jun '14, 11:00

Tischa's gravatar image

Tischa
92531953
Akzeptiert: 71%

bearbeitet 02 Sep '14, 03:34

Ijon%20Tichy's gravatar image

Ijon Tichy
4.4k618

Du meinst beispielsweise sowas wie \newcommand{\Name}[1]{\textsl{#1}} und jetzt soll aber der "Name" nur bei Erstnennung in Kapitälchen erscheinen - richtig?

(28 Jun '14, 11:16) cis

Ja. Ich glaube, so in etwas.

\documentclass[12pt]{article} \usepackage[main=ngerman,icelandic,danish]{babel} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{soulutf8} \begin{document} \newcommand{\Besiedelung}[1]{\so{#1}} Die \Besiedelung ist ein Test. Hier wäre der Sperrsatz gefragt. Noch eine \Besiedelung benötigt aber keinen Sperrsatz. \end{document}

(28 Jun '14, 11:29) Tischa

Da Du glossaries mit der acronym Option erwähnst: willst Du da den komplette ersten Eintrag, also lang und kurz sperren, oder nur die Kurzform, die später weiterhin verwendet wird?

(29 Jun '14, 11:35) Clemens

@Clemens

Grundsätzlich muss es kein Begriff sein, den ich später abkürze. Ich denke, dass es sinnvoller wäre, nur den ersten Begriff zu sperren.

(29 Jun '14, 11:43) Tischa

@Tischa wieso erwähnst Du dann glossaries? Die Frage liest sich für mich: »wie kann ich bei glossaries die erste Erscheinung von Einträgen formatieren?« (Eine gute Frage übrigens, weil das gar nicht so leicht ist, wie es klingt...)

(29 Jun '14, 11:46) Clemens

@Clemens Das sollte nur zur Anschauung dienen, welchen Prinzip mit "automatisieren" ich meine. Mit glossaries funktionieren ja Abkürzungen, wenn man das als Hervorhebung bezeichnen könnte, sehr gut. Ich würde eben jedoch anstelle der ,Hervorhebung' Abkürzung setzen, bei der Erstnennung so{} verwenden, obwohl ich natürlich glossaries auch verwende. Gut wäre natürlich, wenn es hierfür ein flexibles Paket gäbe, bei dem man anstelle von so{} auch andere Hervorhebungen verwenden könnte.

Mit der guten Frage, war das reiner Zufall.:D

(29 Jun '14, 11:51) Tischa

@Tischa ich muss zugeben, ich hab immer noch nicht kapiert, worauf Du letzten Endes hinaus willst. Aber vielleicht hab ich ja heute eine lange Leitung...

(29 Jun '14, 11:55) Clemens

@Clemens ich versuch es nochmal.:-D

Wenn ich einen Text schreibe und ich z.B. Eigennamen, Übersetzungen o.ä. verwende, möchte ich bei der Erstnennung eine bestimmte Formatierung nutzen. Bei der Folgenennung reicht die normale Schriftformatierung aus.

Bsp.: Wenn ich von textsc{Heinz Müller} schreibe, möchte ich bei der Erstnennung Kapitälchen (oder Sperrschrift oder sonstige Möglichkeiten) haben. Bei der Folgenennung von Heinz Müller aber nicht mehr. Leider weiß ich aber nicht, wann Heinz Müller im Text zum ersten Mal erscheint.

(29 Jun '14, 12:02) Tischa

Wenn es nun ein Paket/Makro gäbe, bei dem ich vordefinieren kann, das Heinz Müller bei der Erstausgabe in einem besonderen Format so{Heinz Müller}, textsc{Heinz Müller} oder sonst wie ausgegeben wird, würde es ja ausreichen, wenn ich einfach durch einen Befehl(Heinz Müller) immer von Befehl{Heinz Müller} schreibe und bei der Ausgabe automatisch nur die Erstnennung so erfolgt. glossaries funktioniert ja sehr gut bei Abkürzungen, dem Prinzip folgend wäre eine Lösung wunderbar.

(29 Jun '14, 12:05) Tischa
Ergebnis 5 von 9 Alle anzeigen

Hier ist ein Vorschlag für die einfache handgemachte Methode. etoolbox und dessen Befehle sind dafür nicht zwingend nötig, machen das ganze aber noch ein bisschen bequemer und übersichtlicher.

Das folgende Makro prüft bei einem Eintrag, ob ein internes Makro dafür existiert und definiert es, falls nicht. Gleichzeitig wird ein Nicht-Existieren als Indiz für erste Verwendung gedeutet:

Der Code ist unabhängig von soul und nimmt als Beispiel das Formatieren von Namen. Die erste und die weiteren Formatierungen werden durch die Makros

Open in writeLaTeX
\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}

gesteuert, die man sich aber beliebig anders definieren könnte.

Open in writeLaTeX
\documentclass{article}
\usepackage{etoolbox}

\newrobustcmd*\name[1]{%
  \ifcsdef{name@\detokenize{#1}}
    {\nameformat{#1}}
    {\csgdef{name@\detokenize{#1}}{}\namefirstformat{#1}}%
}
\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}

\begin{document}

zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip

\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}

\end{document}

alt text


Achtung: verwendet man es in \section und es landet im Inhaltsverzeichnis, dann ist dort das erste Erscheinen. Das müsste man u.U. gesondert behandeln, vielleicht mit einem optionalen Stern:

Open in writeLaTeX
\documentclass{article}
\usepackage{etoolbox}

\makeatletter
\newrobustcmd*\name{%
  \@ifstar
    {\name@star}
    {\name@nostar}%
}
\newrobustcmd*\name@nostar[1]{%
  \ifcsdef{name@\detokenize{#1}}
    {\nameformat{#1}}
    {\csgdef{name@\detokenize{#1}}{}\namefirstformat{#1}}%
}
\newrobustcmd*\name@star[1]{\nameformat{#1}}

\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}
\makeatother

\begin{document}

\tableofcontents

\section{\name*{Max Mustermann}}

zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip

\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}

\end{document}

alt text


Edit: mit Möglichkeit, die Namen zu »Resetten«

Open in writeLaTeX
\documentclass{article}
\usepackage{etoolbox}

\makeatletter
\newcommand*\used@names{}
\newcommand*\define@name[1]{%
  \csgdef{name@\detokenize{#1}}{}%
  \listgadd\used@names{#1}%
}
% Achtung: nicht global und erlaubt damit auch temporäres Resetten:
\newcommand*\undefine@name[1]{\csundef{name@\detokenize{#1}}}

% Achtung: nicht global und erlaubt damit auch temporäres Resetten:
\newrobustcmd*\resetnames{%
  \forlistloop{\undefine@name}{\used@names}%
  \def\used@names{}%
}

\newrobustcmd*\name{%
  \@ifstar
    {\name@star}
    {\name@nostar}%
}
\newrobustcmd*\name@nostar[1]{%
  \ifcsdef{name@\detokenize{#1}}
    {\nameformat{#1}}
    {\namefirstformat{#1}\define@name{#1}}%
}
\newrobustcmd*\name@star[1]{\nameformat{#1}}

\newcommand*\namefirstformat[1]{\textsc{#1}}
\newcommand*\nameformat[1]{#1}
\makeatother

\begin{document}

\tableofcontents

\section{\name*{Max Mustermann}}

zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip

\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}

\section{\name*{Mia Musterfrau}}
\resetnames
zuerst \name{Max Mustermann} und dann \name{Max Mustermann} \par
zuerst \name{Mia Musterfrau} und dann \name{Mia Musterfrau} \par\bigskip

\name{Max Mustermann}, \name{Donald Duck} und \name{Mia Musterfrau}

\end{document}

alt text

Da etoolbox schon geladen ist, könnte man jetzt mit

Open in writeLaTeX
\preto\section\resetnames

in der Präambel dafür sorgen, dass mit jedem Aufruf von \section ein Reset durchgeführt wird-

Permanenter link

beantwortet 29 Jun '14, 12:57

Clemens's gravatar image

Clemens
19.0k113060

bearbeitet 29 Jun '14, 16:13

@Tischa Ich hoffe, ich habe kapiert, was Du wolltest

(29 Jun '14, 12:58) Clemens

@Clemens Ja, ich denke schon.:-D Das sieht sehr gut aus und funktioniert prima. Mich wundert es nur, dass es hierfür nicht schon ein Paket o.ä. gibt. Deshalb war/bin ich mir nicht sicher, inwieweit meine Frage typographisch oder stilistisch überhaupt sinnvoll bzw. zulässig ist.

(29 Jun '14, 13:01) Tischa

Was heißt Du denkst schon? :() Also ich denke,das ist es, und das hat jetzt auch mal hinreichenden Einfachheitsgrad. (Ansonstens solltest Du bei solch "Kompliziertem" einen Text in Bild+Code angeben, der das spiegelt, was Du willst) Zur Frage "typographisch sinnvoll",frage mich nicht und werde immer sagen: "Dein Text, Deine Entscheidung, wie Du die Formatierung handhaben willst" - aber: Bei überfliegen der 'Springer Textsatz Forschriften' (oder teubner) las ich erstmaliges Nennen eines Fachbegriffs so "Fachbegriff", später ohne Gänsefüße.Siehe für Details springer/teubner in doc.html

(29 Jun '14, 13:19) cis

Naja, was heißt »es gibt keine Pakete«. Für spezielle Varianten dessen gibt es die ja sehr wohl, wie z.B. eben für Akronyme und Abkürzungen. Für andere dann auch wieder nicht...

Was die Typographie-Frage angeht: Sperren eines Textes oder einzelner Worte ist so eine Sache... Faustregel ist, Text mit Kleinbuchstaben nie zu sperren, Text mit Varsalien oder Kapitälchen immer moderat zu sperren (und das ergebnis auf jeden Fall genau zu überprüfen und ggf. von Hand nachzubessern.

(29 Jun '14, 13:26) Clemens

@Clemens Ich weiß, jetzt würde es vielleicht zu kniffelig werden, aber wäre es noch möglich, dass je nach Dokumententyp bei z.B. einem neuen Kapitel die Erstausgabe wieder besonders ausgegeben würde, obwohl im vorherigen schon die Erstnennung war? Sprich, kann man das chapter, section oder sonst ähnlich regeln? Wenn ich was von Paketerstellung verstehen würde, wäre das mein erster Versuch.:-D

(29 Jun '14, 13:30) Tischa

@Tischa ich hab was hinzugefügt. Wenn ich daraus ein Paket machen würde, dann würde ich das ganze noch generischer angehen und dafür sorgen, dass man mit \newfirstformat{\name}{\textsc}{} o.ä. den speziellen Befehl selber definieren kann (und weitere wenn gewünscht).

(29 Jun '14, 13:52) Clemens

@Clemens Merci fuer die schnelle Hilfe. Ja, wie gesagt, ich versteh weder von der Paketerstellung was, noch habe ich das Ganze bis zum Ende durchdacht.:D Wie gesagt, mich wundert es schon eher, dass es so etwas noch nicht gibt.:D

(29 Jun '14, 14:00) Tischa

@Tischa: Warum willst Du denn das unbedingt als Paket? :() Auf die Frage, wofür man überall ein (neues) Paket brauchen könnte, könnte man ein Buch schreiben, was trotzdem niemals vollständig wäre. Wenn Dich der viele Code stört, lagere ihn in einer externen Datei aus und dann \input{MeineFormatierungen.tex} ;)

(29 Jun '14, 14:05) cis

@cis Möchte ich nicht, vor allem, wenn ich aufgrund meiner linken Hände nix dazu beitragen könnte.:-D Aber das mit dem input ist ein super Tipp. Wo müßte ich das einbinden? In der Präambel.

(29 Jun '14, 14:10) Tischa

@Tischa, daraus ein Paket machen, ist einfach: speichere den Code (ohne \makeatletter und \makeatother, die brauchts in Paketen nicht und schaden eher) in einer Datei meinpaket.sty , füge am Anfang die Zeile \ProvidesPackage{meinpaket} hinzu. Jetzt lässt sie sich mit \usepackage{meinpaket} verwenden.

(29 Jun '14, 14:18) Clemens

Ach ja, statt \usepackage{etoolbox} sollte im Paket \RequirePackage{etoolbox} stehen.

(29 Jun '14, 14:20) Clemens

@Tischa: Als AW auf die Frage: generell kannst Du den Dokumentkopf ganz oder teilweise aulagern; ein Dokument könnte dann so aussehen:

\input{header.tex}
\begin{document}
Hallo Welt.   
\end{document}  

Mache ich nicht so gern, weil man dann oft soviel springen muß.

PS: Wenn Du allerdings wirklich an der Erstellung neuer (eigener) Pakete interessiert bist, eröffne doch eine neue Frage - das dürfte sicher viele interessieren (ich zähle mich schonmal dazu)

(29 Jun '14, 14:28) cis
Ergebnis 5 von 12 Alle anzeigen

Hier ist mal noch ein Vorschlag mit dem Paket datatool. Damit kann man sich eine Datenbank definieren, in die man alle Begriffe einträgt, die bereits hervorgehoben wurden. Bei erneuter Verwendung eines solchen Begriffes wird dieser dann normal ausgegeben. Im folgenden wird die Hervorhebung mit \textsc{...} gemacht, möglich wären aber auch andere Befehle wie zum Beispiel \emph{...}.

Open in writeLaTeX
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc} 
\usepackage{datatool}

\newcommand\hvg[1]{%
  \DTLifdbexists{Hervorhebungen}{%
    \def\shvgtest{nein}%
    \DTLforeach{Hervorhebungen}{\shvg=schon hervorgehoben}{%
      \DTLifeq{#1}{\shvg}{%
        \def\shvgtest{ja}% 
        \dtlbreak%
      }{}%
    }%
  }{%
    \DTLnewdb{Hervorhebungen}%
    \newcommand\shvgtest{nein}%
  }%
  \DTLifeq{ja}{\shvgtest}{%
    #1%
    }{%
    \DTLnewrow{Hervorhebungen}%
    \DTLnewdbentry{Hervorhebungen}{schon hervorgehoben}{#1}%
    \textsc{#1}%
  }%
}

\begin{document}
\begin{itemize}
  \item Das ist ein \hvg{Test}, 
    bei dem die erste \hvg{Ausgabe} eines Textstückes hervorgehoben wird.
  \item Das ist ein \hvg{Test}, 
    bei dem die erste \hvg{Ausgabe} eines Textstückes hervorgehoben wird.
  \item Wie man sieht, 
    bei der \hvg{zweiten} \hvg{Ausgabe} dann aber nicht mehr.
\end{itemize}
\end{document}

alt text


Will man allerdings wirklich das Paket soulutf8 verwenden und Begriffe durch Sperrung hervorheben, ist ein auf die Hervorhebung folgendes Leerzeichen wichtig, damit die Abstände vor und nach dieser richtig eingestellt werden. Deshalb muss mindestens das nachfolgende Leerzeichen als zweites Argument übergeben werden. Falls dagegen ein Punkt oder Komma folgt, kann das zweite Argument leer bleiben. (Vermutlich geht das irgendwie eleganter, ich habe aber gerade keine Idee dafür.)

Open in writeLaTeX
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc} 
\usepackage{soulutf8}
\usepackage{datatool}

\newcommand\hvg[2]{%
  \DTLifdbexists{Hervorhebungen}{%
    \def\shvgtest{nein}%
    \DTLforeach{Hervorhebungen}{\shvg=schon hervorgehoben}{%
      \DTLifeq{#1}{\shvg}{%
        \def\shvgtest{ja}% 
        \dtlbreak%
      }{}%
    }%
  }{%
    \DTLnewdb{Hervorhebungen}%
    \newcommand\shvgtest{nein}%
  }%
  \DTLifeq{ja}{\shvgtest}{%
    #1#2%
    }{%
    \DTLnewrow{Hervorhebungen}%
    \DTLnewdbentry{Hervorhebungen}{schon hervorgehoben}{#1}%
    \so{#1}#2%
  }%
}

\begin{document}
\begin{itemize}
  \item Das ist ein \hvg{Test}{},
    bei dem die erste \hvg{Ausgabe}{ }eines Textstückes hervorgehoben wird.
  \item Das ist ein \hvg{Test}{},
    bei dem die erste \hvg{Ausgabe}{ eines} Textstückes hervorgehoben wird.
  \item Wie man sieht,
    bei der \hvg{zweiten}{ }\hvg{Ausgabe}{ }dann aber nicht mehr.
\end{itemize}
\end{document}

alt text

Permanenter link

beantwortet 29 Jun '14, 10:12

esdd's gravatar image

esdd
14.2k53251

bearbeitet 29 Jun '14, 15:47

Hallo @esdd

vielen Dank für Deine Vorschläge, die schon mal ein guter Anfang sind. Ich glaube, dass das in der Praxis mit dem Leerzeichen etwas schwierig sein würde. Ein Idee, aber noch ungetestet, wäre vielleicht Glossaries Zweck zu entfremden?

usepackage[nonumberlist,acronym]{glossaries} renewcommand{acronymname}{Acrainmneacha}% renewcommand{acronymname}{Abkürzungsverzeichnis}% makeglossaries renewcommand*{glspostdescription}{} newacronym{Ausgabe}{Ausgabe}{so{Ausgabe}}

Vielleicht sitze ich auch nur einem grds. Denkfehler auf und meine Idee ist unsinnig?:-D

(29 Jun '14, 11:44) Tischa

@Tischa Das Problem mit den Leerzeichen kommt von dem geänderten Buchstabenabstand bei Verwendung von \so{...}. Wenn du die Hervorhebung statt dessen mit \emph{...} oder \texstsc{...} vornimmst, ist es egal, welche Zeichen folgen.

(29 Jun '14, 15:53) esdd

Am einfachsten ist es ein Makro zu bauen, das seine eigene Definition ändert.

Open in writeLaTeX
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc} 
\usepackage{soulutf8}
\newcommand\Besiedelung[1]{\so{#1}\renewcommand\Besiedelung[1]{##1}}
\begin{document}
Die \Besiedelung{ist ein Test}. Hier wäre der Sperrsatz gefragt. Noch eine \Besiedelung{benötigt aber keinen Sperrsatz}.
\end{document}

alt text

Permanenter link

beantwortet 29 Jun '14, 05:16

Henri's gravatar image

Henri
10.0k31730

Sehr simpel und praktisch gelöst und ich wollte schon mit countern arbeiten.

(29 Jun '14, 05:38) cis

Leider nicht ganz was ich meine. Der Inhalt in den Klammer Deines Beispiel ist ja unterschiedlich. Vielleicht nochmal zur Erklärung.

Wenn ich EINEN Begriff mehrfach verwende, denn ich speziell hervorheben möchte (in meinem Falle mit so{}), beim Schreiben aber noch nicht weiß, wo und wann zum ersten Mal, dann wäre eine Automatisierung hilfreich, ähnlich wie z.B. bei Abkürzungspaketen.

(29 Jun '14, 07:01) Tischa

Hier ist dann ein weiterer Vorschlag mit dem Paket etoolbox, bei dem bereits hervorgehobene Begriffe in ein einfaches Listenmakro eingetragen werden. Dessen Inhalt kann zum Zurücksetzen einfach gelöscht werden.

Open in writeLaTeX
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc} 
\usepackage{etoolbox}

\newcommand\hvglist{}% leere Liste

\newcommand\hvg[1]{%
  \ifinlist{#1}{\hvglist}% schauen, ob schon in Liste
  {#1}% wenn ja: normale Ausgabe
  {\textsc{#1}% wenn nein: auszeichnen und ...
    \listgadd{\hvglist}{#1}}% ... zu Liste hinzufügen
}

\preto\section{\def\hvglist{}}% am Abschnittsanfang Liste zurücksetzen

\begin{document}

\section{Erster Abschnitt}
\begin{itemize}
  \item Das ist ein \hvg{Test}, 
    bei dem die erste \hvg{Ausgabe} eines Textstückes hervorgehoben wird.
  \item Das ist ein \hvg{Test}, 
    bei dem die erste \hvg{Ausgabe} eines Textstückes hervorgehoben wird.
  \item Wie man sieht, 
    bei der \hvg{zweiten} \hvg{Ausgabe} dann aber nicht mehr.
\end{itemize}

\section{Zweiter Abschnitt}
\begin{itemize}
  \item Das ist ein \hvg{Test}, 
    bei dem die erste \hvg{Ausgabe} eines Textstückes hervorgehoben wird.
  \item Das ist ein \hvg{Test}, 
    bei dem die erste \hvg{Ausgabe} eines Textstückes hervorgehoben wird.
  \item Wie man sieht, 
    bei der \hvg{zweiten} \hvg{Ausgabe} dann aber nicht mehr.
\end{itemize}

\end{document}

alt text

Permanenter link

beantwortet 04 Jul '14, 10:21

esdd's gravatar image

esdd
14.2k53251

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×20
×14
×11
×2

Frage gestellt: 28 Jun '14, 11:00

Frage wurde angeschaut: 4,177 Mal

Zuletzt aktualisiert: 02 Sep '14, 03:34