goLaTeX - Mein LaTeX-Forum

Mein LaTeX-Forum


Login  | Registrieren
Forum
      Option
[Erweitert]
  • Diese Seite weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Letztes Zeichen eines Arguments (Variablen) nicht ausgeben

 

IRM
Forum-Anfänger
Forum-Anfänger

Beiträge: 20
Anmeldedatum: 11.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2016, 21:32     Titel: Letztes Zeichen eines Arguments (Variablen) nicht ausgeben
  Antworten mit Zitat      
Guten Abend Smile
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!
Code • Öffne in Overleaf

\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}
 
Private Nachricht senden Benutzer-Profile anzeigen

esdd
Forum-Meister
Forum-Meister

Beiträge: 2096
Anmeldedatum: 07.02.10
Wohnort: Stutensee
Version: MiKTeX 2.9
     Beitrag Verfasst am: 26.05.2016, 12:16     Titel:
  Antworten mit Zitat      
Du kannst Dir das Paket Dokumentationxstring anschauen:

Code • Öffne in Overleaf

\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.
Private Nachricht senden Benutzer-Profile anzeigen

IRM
Forum-Anfänger
Forum-Anfänger

Beiträge: 20
Anmeldedatum: 11.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2016, 20:50     Titel:
  Antworten mit Zitat      
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:
Code • Öffne in Overleaf

\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:
Zitat:
Extra \fi. <argument> \fi l.25 \idx{Überschrift:}
Private Nachricht senden Benutzer-Profile anzeigen

esdd
Forum-Meister
Forum-Meister

Beiträge: 2096
Anmeldedatum: 07.02.10
Wohnort: Stutensee
Version: MiKTeX 2.9
     Beitrag Verfasst am: 27.05.2016, 00:01     Titel:
  Antworten mit Zitat      
Versuchs mal mit:

Code • Öffne in Overleaf
\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}
Private Nachricht senden Benutzer-Profile anzeigen

IRM
Forum-Anfänger
Forum-Anfänger

Beiträge: 20
Anmeldedatum: 11.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2016, 21:52     Titel:
  Antworten mit Zitat      
Super! Vielen Dank, hat funktioniert!
Private Nachricht senden Benutzer-Profile anzeigen

IRM
Forum-Anfänger
Forum-Anfänger

Beiträge: 20
Anmeldedatum: 11.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2016, 22:28     Titel:
  Antworten mit Zitat      
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!!
Private Nachricht senden Benutzer-Profile anzeigen

Noch so einer
Gast

Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2016, 09:13     Titel:
  Antworten mit Zitat      
Mangels vollständigem InfoMinimalbeispiel zu dem neuerlichen Problem, weiß ich nicht, wie bei Dir \ac definiert ist. Hier daher ein allgemeiner Vorschlag:
Code • Öffne in Overleaf
\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:
Code • Öffne in Overleaf
\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 Paket auf CTANxspace-Befehle gar nicht mehr verwendet werden:
Code • Öffne in Overleaf
\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:
Code • Öffne in Overleaf
\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: 20
Anmeldedatum: 11.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2016, 11:25     Titel:
  Antworten mit Zitat      
Entschuldige bitte das fehlende Minimalbeispiel.
Ich verwende das acronym Paket deshalb auch \ac{}, \acs{} usw.

Code • Öffne in Overleaf

\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...
Private Nachricht senden Benutzer-Profile anzeigen

Noch so einer
Gast

Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2016, 13:15     Titel:
  Antworten mit Zitat      
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:
Code • Öffne in Overleaf
\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:
Code • Öffne in Overleaf
\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 Paket auf CTANxstring 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:
Code • Öffne in Overleaf
\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}

Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen
.

goLaTeX ist Teil der goForen
goForen.de goMATLAB.de goLaTeX.de goPCB.de


  Impressum | FAQ | goLaTeX RSS Button RSS-Feed

Copyright © 2008 - 2017 goLaTeX.de