Letztes Zeichen eines Arguments (Variablen) nicht ausgeben

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Letztes Zeichen eines Arguments (Variablen) nicht ausgeben

von Noch so einer » Sa 30. Jul 2016, 13:15

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}

von IRM » Sa 30. Jul 2016, 11:25

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...

von Noch so einer » Sa 30. Jul 2016, 09:13

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.

von IRM » Fr 29. Jul 2016, 22:28

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!!

von IRM » Fr 27. Mai 2016, 21:52

Super! Vielen Dank, hat funktioniert!

von esdd » Fr 27. Mai 2016, 00:01

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}

von IRM » Do 26. Mai 2016, 20:50

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:}

von esdd » Do 26. Mai 2016, 12:16

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.

Letztes Zeichen eines Arguments (Variablen) nicht ausgeben

von IRM » Mi 25. Mai 2016, 21:32

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}

Nach oben