PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : \% umdefinieren



Xenara
11-09-2005, 12:16
Hi,

Ich hab ein kleines "Problem":

Normalerweise schreibe ich " 2~\%" um "2 %" zu erhalten.
Allerdings sieht es nicht besonders hübsch aus, wenn der Abstand zwischen der Zahl und dem Prozentzeichen gleich groß ist, wie zwischen zwei Wörtern.
Ich würde jetzt gerne den Befehl "\%" so umdefinieren, dass wenn ich "2~\%" schreibe als Ergebnis ein kleinerer Abstand zwischen "2" und "%" resultiert, also quasi "2\,\%". Diese Möglichkeit will ich nicht, da das 1) lästig zum Schreiben ist 2) die Gefahr eines Zeilenumbruchs zwischen der 2 und dem % besteht und 3) ich der Meinung bin, dass das doch auch eleganter gehen muss (Hang zum Perfektionismus :D )

Ich habe jetzt folgendes versucht:
\providecommand{\%}{\hspace{-0.5ex}\% }
Das hätte den Vorteil, dass ich nach wie vor den alten Befehl \% nutzen kann (auch in früheren Dokumenten) und ich mit ~ dem Zeilenunterbruch unterbinden kann und trotzdem der Abstand zwischen "2 %" verkleinert wird.
Leider tuts nicht so wie ichs mit gedacht hab, der Compiler ist da überhaupt nicht mit einverstanden :(

Hat von euch jemand eine Idee? Wär euch echt dankbar.

Grüße,
Xenara

countbela666
11-09-2005, 12:36
Hallöchen Xenara,

das ganze funktioniert nicht, weil du den Befehl, den du neu definierst, in der Definition verwendest. Das ergibt eine nette Rekursion, die dummerweise nicht terminiert, woraufhin TeX mit seinem Äquivalent eines Stacküberlaufs antwortet. Das ganze kannst du umgehen, indem du in der Definition das vordefinierte Makro durch den Aufruf des Prozentsymbols des aktuellen Fonts ersetzt, also etwa so:

\renewcommand{\%}{\hspace{-.5ex}\symbol{37}}Btw.: providecommand funzt hier nicht.

Grüße,
Marcel

Xenara
11-09-2005, 12:51
Super, vielen vielen Dank.
Hatte schon so ne Ahnung, wieso es nicht geht, das \symbol{37} hat mir gefehlt. Hatte es mit renewcommand schon probiert, da gings (logischerweise) auch nicht.

Wo liegt eigentlich der Unterschied zwischen providecommand und (re)newcommand?
Hab da bei mir noch das drin
\providecommand{\bt}{\begin{tabular}{ll}}
% \bt für Beginn 2-spaltige Tabelle
und das tut nur mit providecommand. Hat das was mit der Tabellenumgebung zu tun?

countbela666
11-09-2005, 13:00
Wo liegt eigentlich der Unterschied zwischen providecommand und (re)newcommand?
Der Befehl providecommand vereint newcommand und renewcommand in sich, indem er prüft, ob der neue Befehl schon existiert. Ist das der Fall, wird er umdefiniert, andernfalls neu angelegt. Eigentlich sollte man deswegen mit providecommand nichts falsch machen können, warum es in dem Fall nicht klappt, weiß ich nicht genau. Vielleicht weil \% nicht als wirklicher Befehl, den providecommand "finden" kann, existiert, sondern bloß als Escape-Sequenz/Maskierung. :confused:

Grüße,
Marcel

Xenara
11-09-2005, 18:18
Ok, danke.

Hab nur jetzt leider festgestellt, dass ich mir ein neues Problem geschaffen hab, weil ich öfters grad in Formeln nur das % brauch, also z.B.
F [%] = m [g] * 100
Da siehts natürlich blöd aus, wenn da auch noch ein Abstand davor ist.

Gibts da ne Möglichkeit zu definieren, dass wenn man "Zahl~\%" schreibt, dass dann der Abstand automatisch kleiner ist? Also dass das geht, ohne einen neuen Befehl zu definieren?
Oder kann man die ~ für das geschützte Leerzeichen "verkleinern"? Wär praktisch, weil ich dauernd auch Formeln und Einheiten und so hab, da wär der kleinere Abstand ja auch nicht verkehrt.

countbela666
11-09-2005, 19:26
Hab nur jetzt leider festgestellt, dass ich mir ein neues Problem geschaffen hab, weil ich öfters grad in Formeln nur das % brauchDann nimm für diese Fälle doch wieder \symbol{37}, dann hast du keinen Ärger mit weiteren neuen Befehlen.

Grüße,
Marcel

Xenara
11-09-2005, 19:49
Hab ich auch schon überlegt, ist mir aber ehlich gesagt zu aufwändig und wird im Quellcode etwas übersichtlich.
Ich hab in fast jedem zweiten Satz ein %, da hätt ich es gern so einfach wie möglich.

Hast du eine Idee, wie ich das mit dem geschützen Leerzeichen hinkriegen kann? Dass die Tilde kein ganz normales Leerzeichen ist, sonder bloss ein halbes?

Oder kann man eine Datei einrichten, in der drinsteht
"Wenn im Quelltext 5 \% steht, dann darf zwischen 5 und \% nicht umgebrochen werden und der Abstand beträgt 0.5 ex"
Wär auch ganz hübsch für 2 m oder 49 kg oder solche Einheiten.

chris3344
11-09-2005, 20:59
Hallo...

Ich finde, dass Ihr (bzw. Du) nur ein Problem mit den Variablen habt!!!

Sag doch einfach das \% für NORMAL also [%]
und
\xyz für ~\symbol{37} 5 %

Gruß,

Christoph

countbela666
12-09-2005, 10:15
Hi Xenara,

Oder kann man eine Datei einrichten, in der drinsteht
"Wenn im Quelltext 5 \% steht, dann darf zwischen 5 und \% nicht umgebrochen werden und der Abstand beträgt 0.5 ex"
Wär auch ganz hübsch für 2 m oder 49 kg oder solche Einheiten.
Hmm, du könntest dir ein Shellskript schreiben, was diese Konvertierungen übernimmt, also je nachdem ob du unter Linux

#!usr/bin/bash
if [ -f "$1" ] ; then
cat "$1" | sed 's/\([0-9]\) \\%/\1~\\hspace\{-\.5ex\}\\symbol\{37\}/g' > tmpfile
cat tmpfile > "$1"
rm -f tmpfile
else
echo $1 ist keine Datei
fioder unter Windows arbeitest:

@ECHO OFF
SET PATH=%PATH%;C:\Programme\GnuWin32\bin
IF NOT EXIST "%1" GOTO Nofile
TYPE "%1" | sed "s/\([0-9]\) \\%/\1~\\hspace\{-\.5ex\}\\symbol\{37\}/g" > tmpfile
TYPE tmpfile > "%1"
DEL tmpfile
GOTO End
:Nofile
ECHO "%1" ist keine Datei
:End
Die Windows Batchdatei geht davon aus, dass der Stream Editor Sed for Windows (http://gnuwin32.sourceforge.net/packages/sed.htm) installiert ist. Das Skript kannst du dann vor dem Compilieren über den Quelltext jagen (scriptname quellcode.tex) oder z.B. unter Windows im TeXnicCenter als Postprozessor angeben (dann muss aber zweimal compiliert werden).

Wenn du den regex für sed noch entsprechend anpasst, kannst du das dann auch für andere Einheiten vornehmen. Klingt bloß fast schon nach ein bisschen viel Aufwand... :D

Grüße,
Marcel

Xenara
12-09-2005, 10:26
Uah, ja, das ist etwas komplizierter :(

Hm, wie würde man denn die ~ ändern?

Btw. arbeite mit Mac/TeXShop

knu
12-09-2005, 10:37
Hmm.. ich denke bei Deinem Problem an das Package units

Xenara
12-09-2005, 10:54
Aber mit units muss ich für jede Einheit jedesmal
\unit[Wert]{Einheit}
eintippen, oder?
Das find ich ziemlich lästig.

Ich weiß, ich stell Ansprüche, sorry :o
Hab als das Problem, dass ich öfters in 3 Tagen ein 50-Seiten-Protokoll schreiben muss, und da bin ich froh um alles, was nicht noch extra Zeit kostet.

Würds gern mal mit der "halben ~" probieren, wie müsst ich denn das definieren? Bzw. wo ist es definiert?

etilli33
12-09-2005, 11:50
Ich misch mich jetzt einfach mal unqualifiziert ein: warum nimmst du nicht einfach den kleinen Abstand \, ? Soweit ich weiß, wird nach dem auch nicht umgebrochen.

Till

countbela666
12-09-2005, 16:00
Würds gern mal mit der "halben ~" probieren, wie müsst ich denn das definieren? Bzw. wo ist es definiert?
Die Tilde ist ein Makro, das auf \nobreakspace verweist, welches ein robuster Befehl ist, der wiederum normalerweise zu {\leavevmode\nobreak} expandiert, wenn er nicht durch andere Pakete verändert wird. Theoretisch könntest du also das Verhalten der "Tilde" als geschütztes Leerzeichen durch

\renewcommand{\nobreakspace}{\leavevmode\nobreak\h space{.25ex}}ändern. Ob du so tief in den TeX-Interna rumpfuschen möchtest, musst du wissen. Auf den ersten Blick scheint es zu funktionieren, aber das Wahre ist es glaub ich nicht.

Grüße,
Marcel

Xenara
12-09-2005, 16:32
Ok, vielen vielen Dank für eure Hilfe und eure Geduld. Hab ne Menge wieder über LaTeX gelernt :)

Auf die Sache mit der ~ komm ich wieder zurück, wenn ich mein eigenes LaTeX schreib :D Ist wirklich etwas zu tief drin rumgewurstelt.

Hab jetzt folgende Lösung gefunden, die zu funktionieren scheint:
Ich schreibe wie von Till vorgeschlagen 2\,\%. Er bricht wirklich nicht um, das wusste ich nicht.
Allerdings habe ich aus Faulheit meine Autocompletion-Funktion in TeXShop so geändert, dass ich anstatt "\," nur "#" tippen brauche d.h. ich schreib jetzt "2#\%" und es kommt raus was soll.
("\" geht bei mir über Alt-Shift-7, da muss ich jedesmal beide Hände von der Tastatur nehmen, das versuch ich so oft wie möglich zu vermeiden.)