Letztes Zeichen eines Arguments (Variablen) nicht ausgeben

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Letztes Zeichen eines Arguments (Variablen) nicht ausgeben

Beitrag von IRM »

Guten Abend :)
In meinen Dokument habe ich mir einen Befehl gebastelt um einen Text fett darzustellen und ihn gleichzeit als Index-Eintrag zu erstellen. Da es häufig Aufzählungen sind, ist oft das letzte Zeichen ein ":"
Das möchte ich zwar auch fett drucken der Doppelpunkt soll aber im Indexeintrag fehlen. Wie kann mein MiniBeispiel umschreiben, dass zuerst das gesamte Argument fett ausgegeben wird und dann nur der Teil vor dem Doppelpunkt. Sprich wenn das letzte Zeichen ein Doppelpunkt ist soll der Doppelpunkt nicht ausgegeben werden. Ist es Möglich das letzte Zeichen eines Arguments asuzulesen und wegzulassen. Also quasi STring-Operationen?
Vielen Dank!
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} %
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\begin{document}
	\newcommand{\idx}[1]{\textbf{#1}\\#1}
	\idx{Überschrift:}
\end{document}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Du kannst Dir das Paket [d]xstring[/d] anschauen:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook}
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring}
\newcommand{\idx}[1]{%
  \IfEndWith{#1}{:}
      {\textbf{#1}\quad\StrGobbleRight{#1}{1}}
      {\textbf{#1}\quad#1}
}
\begin{document} 
\idx{Überschrift:}
\begin{description}
  \item [\idx{Überschrift:}]
  \item [\idx{Überschrift}]
\end{description}
\end{document}
Definitionen von Makros gehören in aller Regel in die Präambel.

IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Beitrag von IRM »

Vielen Dank! Das Paket habe ich gar nicht gekannt.
Ich muss aber leider nochmal nachfragen. Mit dem Befehl \idx möchte ich das Argument fett ausgegebn und wenn ":" vorhanden ist, das Argument ohne ":" in den Index schreiben. Leider funktioniert es so nicht:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook}
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring}
\usepackage{makeidx}
\makeindex

\newcommand{\idx}[1]{%
	\IfEndWith{#1}{:}
	{\textbf{#1}\index{\StrGobbleRight{#1}{1}}}
	{\textbf{#1}\index{#1@}}
}
\begin{document} 
\idx{Überschrift}

\idx{Überschrift:}
\printindex
\end{document}
Was mache ich falsch?

Fehlermeldung:
Extra \fi. <argument> \fi l.25 \idx{Überschrift:}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Versuchs mal mit:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx} 
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[1]{%
  \noexpandarg
  \IfEndWith{#1}{:} 
    {\StrGobbleRight{#1}{1}[\idxentry]} 
    {\def\idxentry{#1}}%
  \textbf{#1}{\index{\idxentry}}%
} 
\begin{document} 
\idx{Überschrift} 
\clearpage
\idx{Überschrift:} 
\printindex 
\end{document}

IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Beitrag von IRM »

Super! Vielen Dank, hat funktioniert!

IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Beitrag von IRM »

Ich habe noch ein kleines Problem. Wenn ich nun innerhalb \idxfett{} eine Abkürzung nütze wird der Begriff im Index unter Symbols einsortiert.
Also z.B. \idxfett{\ac{ABC}-Test:} dann bekomme ich im Index zwar ABC-Test aber eben nicht unter A einsortiert. Ein schlichtet @#1 kollidiert dann mit der StrGobbleRight Funktion.
Wie kann man das lösen?? Schon mal vielen Dank!!

Noch so einer

Beitrag von Noch so einer »

Mangels vollständigem Minimalbeispiel zu dem neuerlichen Problem, weiß ich nicht, wie bei Dir \ac definiert ist. Hier daher ein allgemeiner Vorschlag:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
  \noexpandarg
  \IfEndWith{#2}{:} 
    {\StrGobbleRight{#2}{1}[\idxentry]} 
    {\def\idxentry{#2}}%
  \textbf{#2}{\expandafter\index\expandafter{\idxentry#1}}%
} 
\begin{document} 
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}
\clearpage
\idx[@ABC]{\ac{ABC}}
\printindex 
\end{document}
und eine Alternative dazu:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][\idxentry]{%
  \noexpandarg
  \IfEndWith{#2}{:} 
    {\StrGobbleRight{#2}{1}[\idxentry]} 
    {\def\idxentry{#2}}%
  \textbf{#2}\index{#1}%
} 
\begin{document} 
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}
\clearpage
\idx[ABC]{\ac{ABC}}
\printindex 
\end{document}
Während man beim ersten Vorschlag den Indexeintrag über das optionale Argument nur ergänzen kann, ersetzt das optionale Argument (wenn es verwendet wird) den gesamten Indexeintrag. Man kann den zweiten Vorschlag auch noch so abändern, dass ggf. bei Verwendung des optionalen Arguments xspace-Befehle gar nicht mehr verwendet werden:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
  \if\relax\detokenize{#1}\relax
    \noexpandarg
    \IfEndWith{#2}{:} 
      {\StrGobbleRight{#2}{1}[\idxentry]} 
      {\def\idxentry{#2}}%
    \textbf{#2}\index{\idxentry}%
  \else
    \textbf{#2}\index{#1}%
  \fi
} 
\begin{document} 
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}
\clearpage
\idx[ABC]{\ac{ABC}}
\printindex 
\end{document}
Bei neueren Versionen von KOMA-Script geht es etwas verständlicher:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
  \IfArgIsEmpty{#1}{%
    \noexpandarg
    \IfEndWith{#2}{:} 
      {\StrGobbleRight{#2}{1}[\idxentry]} 
      {\def\idxentry{#2}}%
    \textbf{#2}\index{\idxentry}%
  }{%
    \textbf{#2}\index{#1}%
  }%
} 
\begin{document} 
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}
\clearpage
\idx[ABC]{\ac{ABC}}
\printindex 
\end{document}
Leider hat aber der Online-Editor eine veraltete Version von KOMA-Script, die \IfArgIsEmpty noch nicht kennt.

IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Beitrag von IRM »

Entschuldige bitte das fehlende Minimalbeispiel.
Ich verwende das acronym Paket deshalb auch \ac{}, \acs{} usw.
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
%\newcommand*{\ac}[1]{#1}
\usepackage{acronym}

\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][\idxentry]{%
  \noexpandarg
  \IfEndWith{#2}{:} 
    {\StrGobbleRight{#2}{1}[\idxentry]} 
    {\def\idxentry{#2}}%
  \textbf{#2}\index{#1}%
} 
\begin{document} 
	\begin{acronym}
		\acro{ABC}{SBCDEFGHIJKLM}
	\end{acronym}
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}
\clearpage
\idx{ABC}
\printindex 
\end{document}
So wird ABC in dern Index korrekt einsortiert. Ich hätte gerne, das \idx{\ac{ABC}} genauso funktioniert. Dein Vorschlag mit dem optionalen Argument funktioniert zwar ist aber unpraktisch.
Bei meinen anderen Aufrufen ist es seh einfach mit \newcommand{\idx}[1]{#1\index{@#1}} gelöst.
Hier geht es aber nciht wegen der String-Operationen um den Doppelpunkt hinten abzuschneiden...

Noch so einer

Beitrag von Noch so einer »

Ich glaube nicht, dass \newcommand{\idx}[1]{#1\index{@#1}} einen korrekten Index-Eintrag erzeugt. Normalerweise ist @ das actual-Zeichen. Das heißt, dass das, was davor steht als Sortierkriterium verwendet wird und das danach als Ausgabe. Uups, deshalb ist eigentlich mein erstes Beispiel falsch und müsste lauten:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
  \noexpandarg
  \IfEndWith{#2}{:} 
    {\StrGobbleRight{#2}{1}[\idxentry]} 
    {\def\idxentry{#2}}%
  \textbf{#2}{\index{#1\idxentry}}%
} 
\begin{document} 
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}
\clearpage
\idx[ABC@]{\ac{ABC}}
\printindex 
\end{document}
Wenn man hingegen einfach nur ein @ vor einen Eintrag schreibt, dann hat der Eintrag kein Sortierkriterium mehr und wird deshalb gar nicht erst ausgegeben:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
\newcommand*{\ac}[1]{#1}
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
  \noexpandarg
  \IfEndWith{#2}{:} 
    {\StrGobbleRight{#2}{1}[\idxentry]} 
    {\def\idxentry{#2}}%
  \textbf{#2}{\index{#1\idxentry}}%
} 
\newcommand{\wrongidx}[1]{\textbf{#1}\index{@#1}}
\begin{document} 
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}

\wrongidx{Dies} \wrongidx{und} \wrongidx{das}.
\clearpage
\idx[ABC@]{\ac{ABC}}
\printindex 
\end{document}
Tatsächlich könntest Du das @ auch weiterhin an den Anfang des \index-Befehls einfach vor \idxentry stellen, wenn es denn generell funktionieren würde, was es aber nicht tut.

Natürlich kannst Du den \idx-Befehl weiter aufbohren und dort mit xstring die Position eines @ im Argument ermitteln und für die Ausgabe den Teil des Strings entfernen. Damit könnte man sich das optionale Argument sparen. Aber mal ehrlich: Ob ich \idx{ABC@\ac{ABC}} oder \idx[ABC]{\ac{ABC}} schreibe, macht keinen großen Unterschied. Dafür lohnt der Aufwand nicht. Deshalb lautet meine Empfehlung:
\documentclass[paper = 155mm:220mm, DIV=13, headinclude, twoside, fontsize=9pt, BCOR=17mm, headsepline, parskip=half, headings=small, toc=chapterentrywithdots]{scrbook} 
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage{xstring} 
\usepackage{makeidx}
\usepackage{acronym}
\makeindex 
\newcommand\idxentry{}
\newcommand{\idx}[2][]{%
  \noexpandarg
  \IfEndWith{#2}{:} 
    {\StrGobbleRight{#2}{1}[\idxentry]} 
    {\def\idxentry{#2}}%
  \textbf{#2}%
  \if\relax\detokenize{#1}\relax
    \index{\idxentry}%
  \else
    \index{#1@\idxentry}%
  \fi
} 
\newcommand{\wrongidx}[1]{\textbf{#1}\index{@#1}}
\begin{document} 
\begin{acronym}
  \acro{ABC}{SBCDEFGHIJKLM}
\end{acronym}
\idx{Aal}

\idx{Apfel}
\clearpage
\idx{Aal:}

\idx{Apfel:}

\clearpage
\idx[ABC]{\ac{ABC}}
\printindex 
\end{document}

Antworten