Seite 1 von 1

Letztes Zeichen eines Arguments (Variablen) nicht ausgeben

Verfasst: Mi 25. Mai 2016, 21:32
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}

Verfasst: Do 26. Mai 2016, 12:16
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.

Verfasst: Do 26. Mai 2016, 20:50
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:}

Verfasst: Fr 27. Mai 2016, 00:01
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}

Verfasst: Fr 27. Mai 2016, 21:52
von IRM
Super! Vielen Dank, hat funktioniert!

Verfasst: Fr 29. Jul 2016, 22:28
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!!

Verfasst: Sa 30. Jul 2016, 09:13
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.

Verfasst: Sa 30. Jul 2016, 11:25
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...

Verfasst: Sa 30. Jul 2016, 13:15
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}