PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Leerzeichen erkennen und ersetzen



krihaa
22-12-2008, 14:37
Hallo zusammen,

ich habe folgendes Problem. Ich möchte gerne einen Befehl definieren und die evtl. im Argument vorkommenden Leerzeichen automatisch durch ein beliebiges Zeichen ersetzen lassen.

Hintergrund ist: Ich benutze XeLaTeX und die die Schrift Linux Libertine. Diese macht eine spezielle Unterstreichung, bei der Unterlängen ausgespart werden -- aber leider auch die Leerzeichen. Diese sollen nun automatisch durch z.B. \rule-Kommandos oder, wie im MB hingetrickst, einen Unterstrich ersetzt werden.

Ist das irgendwie möglich und wie könnte man vorgehen?

Vielen Dank und Gruß


\documentclass{scrartcl}
\usepackage{xunicode}
\usepackage[no-math]{fontspec}
\usepackage{xltxtra}
\setmainfont[Mapping=tex-text,Ligatures=Common]{Linux Libertine}
\makeatletter
\DeclareSymbolFont{rmcustom}{EU1}\rmdefault\mddefa ult\updefault
\DeclareSymbolFont{itcustom}{EU1}\rmdefault\mddefa ult\itdefault
\XeTeXmathchardef\underscore="0 \symrmcustom "005F
\makeatother
\newcommand*\ul[1]{{\setmainfont[Mapping=tex-text]{Linux Libertine U}#1}}
\newcommand{\score}{\raisebox{0.07ex}{$\underscore $}}
\begin{document}
\ul{gla bly luj} \ul{gla\score{}bly\score{}luj}
\end{document}
oder für alle ohne XeLaTeX

\documentclass{scrartcl}
\begin{document}
\newcommand{\ul}[1]{#1}
\ul{Zwischen den Worten sollen automatisch Unterstriche eingefuegt werden}
\end{document}

mechanicus
22-12-2008, 20:43
Hallo,

da ich mich mit XeLatex nicht auskenne, schlage ich dir einfach mal was vor. Du kannst mit Hilfe des Paketes listings so einen Befehl definieren. Da werden Leerzeichen extra hervorgehoben.
Ich habe es nämlich so verstanden, dass du nur die Leerzeichen unterstrichen haben willst.

Gruß
Marco

voss
22-12-2008, 21:43
oder für alle ohne XeLaTeX

\documentclass{scrartcl}
\begin{document}
\newcommand{\ul}[1]{#1}
\ul{Zwischen den Worten sollen automatisch Unterstriche eingefuegt werden}
\end{document}


\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\makeatletter
\newcommand\uline[1]{%
\def\UL@i{}
\def\ul@end{}
\expandafter\ul@i#1 \@nil}
\def\ul@i#1 #2\@nil{%
\def\UL@i{#1}
\expandafter\ul@ii#2 \@nil}
\def\ul@ii#1 #2\@nil{%
\ifx#2\ul@end\UL@i\_#1
\else
\edef\UL@i{\UL@i\_#1}
\expandafter\ul@ii#2 \@nil
\fi}
\makeatother
\begin{document}

\uline{Zwischen den Worten sollen automatisch Unterstriche eingefuegt werden}
\end{document}


Herbert

krihaa
23-12-2008, 11:09
Hallo Marco und Herbert,

vielen Dank für die Antworten und Anregungen. Der Code von Herbert hat (natürlich) funktioniert, aber als ich versucht habe, ihn in meine angepasste Vorlage von Matthias Pospiech einzufügen, auf einmal nicht mehr. Es stand dann
! Use of \ul doesn't match its definition.
\unterstreich ...ef \ul @end{} \expandafter \ul @i
#1 \@nil
l.4 \unterstreich{bla bla} im Log. Habe das neue Kommando \uline durch \unterstreich ersetzt, da \uline schon anderweitig definiert war. Wenn ich den Fehler mit Enter bestätige, geht das Kompilieren weiter und es erscheint im pdf "bla bla nil" (ohne Unterstriche). Kannst du damit etwas anfangen (ohne dass ich die ganze preamble poste) und mir evtl. sagen, wie man das korrigieren kann? Ansonsten habe ich festgestellt, dass wenn ich das Paket xunicode nicht einbinde, der normale Unterstrich \_ genau die gleiche Höhe hat wie die Unterstreichung. Wenn ich es aber einbinde, ist der Unterstrich höher, siehe Anhang. Zur Not werde ich also die Unterstriche dann doch per Hand machen, bis ich merke, wofür ich xunicode genau brauche.;)

Gruß

sommerfee
23-12-2008, 14:13
! Use of \ul doesn't match its definition.
\unterstreich ...ef \ul @end{} \expandafter \ul @i
#1 \@nil

Du hast das \makeatletter ... \makeatother vergessen.

Liebe Grüße,
Axel

krihaa
24-12-2008, 12:40
Hallo Axel,

das war tatsächlich ein Kopierfehler, hatte \makeatletter vergessen. Nun hab ich aber nach langem Probieren wieder einen Fehler.
Beim Kompilieren von

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\makeatletter
\newcommand\uline[1]{%
\def\UL@i{}
\def\ul@end{}
\expandafter\ul@i#1 \@nil}
\def\ul@i#1 #2\@nil{%
\def\UL@i{#1}
\expandafter\ul@ii#2 \@nil}
\def\ul@ii#1 #2\@nil{%
\ifx#2\ul@end\UL@i\_#1
\else
\edef\UL@i{\UL@i\_#1}
\expandafter\ul@ii#2 \@nil
\fi}
\makeatother
\begin{document}

\uline{Wort}
\end{document}
ist die Fehlermeldung
...
)) (/usr/local/texlive/2008/texmf-dist/tex/latex/base/fontenc.sty
(/usr/local/texlive/2008/texmf-dist/tex/latex/base/t1enc.def)) (./bla.aux)
! TeX capacity exceeded, sorry [input stack size=5000].
\@inmathwarn ...latex@warning {Command \protect #1
invalid in math mode}\fi
l.20 \uline{Wort}
Ich denke, bzw. habe es auch getestet, dass es diese Meldung dann gibt, wenn weniger als 2 Leerzeichen innerhalb des Befehls stehen. Diese dürfen auch nicht hintereinander stehen. Also mit \uline{zwei Worte} gibt es den Fehler auch, mit \uline{zwei Worte } nicht. Könnte man jetzt noch diese Kleinigkeit, die es hoffentlich ist, ausmerzen? Das wäre echt genial. Ich kann es leider selbst nicht, da ich den Code von Herbert mit meinen LaTeX-Basis-Kenntnissen nicht verstehe.

Gruß und vielen Dank nocheinmal.

voss
24-12-2008, 13:09
Ich denke, bzw. habe es auch getestet, dass es diese Meldung dann gibt, wenn weniger als 2 Leerzeichen innerhalb des Befehls stehen. Diese dürfen auch nicht hintereinander stehen. Also mit \uline{zwei Worte} gibt es den Fehler auch, mit \uline{zwei Worte } nicht. Könnte man jetzt noch diese Kleinigkeit, die es hoffentlich ist, ausmerzen?


da fehlte etwas ...


\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\makeatletter
\def\ul@end{}
\newcommand\uline[1]{%
\def\UL@i{}
\expandafter\ul@i#1 \@nil}
\def\ul@i#1 #2\@nil{%
\def\@tempa{#2}
\ifx\@tempa\ul@end #1\else
\def\UL@i{#1}%
\expandafter\ul@ii#2 \@nil\fi}
\def\ul@ii#1 #2 #3\@nil{%
\def\@tempa{#2}
\ifx\@tempa\ul@end\UL@i\underline{\space}#1
\else%
\edef\UL@i{\UL@i\_#1}%
\expandafter\ul@ii#2 #3\@nil\fi}
\makeatother
\pagestyle{empty}
\begin{document}

\uline{Zwischen den Worten sollen automatisch Unterstriche eingefuegt werden}

\uline{foo bar}

\uline{foo}

\end{document}

Herbert

krihaa
24-12-2008, 22:24
Vielen herzlichen Dank Herbert, jetzt ist es perfekt!
Musste noch ein wenig rumspielen und Kommentarzeichen einfügen, damit überflüssige Leerzeichen vor und nach der Unterstreichung verschwinden, aber nun bin ich zufrieden.

\documentclass{scrartcl}
\usepackage[T1]{fontenc}

\makeatletter
\def\ul@end{}
\newcommand\uline[1]{%
\def\UL@i{}%
\expandafter\ul@i#1 \@nil}
\def\ul@i#1 #2\@nil{%
\def\@tempa{#2}%
\ifx\@tempa\ul@end #1\else
\def\UL@i{#1}%
\expandafter\ul@ii#2 \@nil\fi}
\def\ul@ii#1 #2 #3\@nil{%
\def\@tempa{#2}%
\ifx\@tempa\ul@end\UL@i\_#1%
\else%
\edef\UL@i{\UL@i\_#1}%
\expandafter\ul@ii#2 #3\@nil\fi}
\makeatother

\begin{document}
foo\uline{bar foo}bar
\end{document}
Ich wünsche allen noch ein schönen Rest-Heiligabend und geruhsame Weihnachtsfeiertage.