Alle Anfangsbuchstaben als Großbuchstaben

Alle Anfangsbuchstaben als Großbuchstaben

am 20.06.2006 15:39:12 von Christoph Bier

Hallo zusammen,

ich habe in einer .tex-Datei ein LaTeX-Makro (\plus{}), in dem 1--5
Wörter vorkommen können, die erstens alle (leider) kleingeschrieben
sind und zweitens nicht nur Buchstaben enthalten können. All diese
Wörter sollen aber mit einem Großbuchstaben beginnen. Genau diese
Ersetzung gelingt mir aber nicht, da \u nur den Anfangsbuchstaben
des /ersten/ Wortes ersetzt; zumindest in meinem vielleicht etwas
naiven Beispiel:

#----------------------------------------------
#!/usr/bin/perl -w
use strict;

my $zeile = '\plus{eins zwei 3 vier 5}';
$zeile =~ s/(\\plus)\{([\d\D]+)\}/$1\{\u$2\}/g;
print "$zeile \n";
#-----------------------------------------------

Als Ergebnis brauche ich: \plus{Eins Zwei 3 Vier 5}

Eine Google-Recherche förderte zu meinem Problem folgendes von
Christian Lackas zu Tage[1]:

»[...] wenn es darum geht Dinge wie 'christian d. lackas' in
'Christian D. Lackas' umzuwandeln. Aber dann wird es auch schnell
richtig kompliziert [...]«

Eine Lösung habe ich leider nicht gefunden. Kann mir hier jemand
weiterhelfen?

Viele Grüße,
Christoph

[1] news:
--
+++ Typografie-Regeln: http://www.zvisionwelt.de/typokurz.pdf (1.4)

Re: Alle Anfangsbuchstaben als Großbuchstaben

am 20.06.2006 15:56:13 von Christian Kirsch

Christoph Bier schrieb:
> Hallo zusammen,
>
> ich habe in einer .tex-Datei ein LaTeX-Makro (\plus{}), in dem 1--5
> Wörter vorkommen können, die erstens alle (leider) kleingeschrieben
> sind und zweitens nicht nur Buchstaben enthalten können. All diese
> Wörter sollen aber mit einem Großbuchstaben beginnen. Genau diese
> Ersetzung gelingt mir aber nicht, da \u nur den Anfangsbuchstaben
> des /ersten/ Wortes ersetzt; zumindest in meinem vielleicht etwas
> naiven Beispiel:
>
> #----------------------------------------------
> #!/usr/bin/perl -w
> use strict;
>
> my $zeile = '\plus{eins zwei 3 vier 5}';
> $zeile =~ s/(\\plus)\{([\d\D]+)\}/$1\{\u$2\}/g;
> print "$zeile \n";
> #-----------------------------------------------
>
> Als Ergebnis brauche ich: \plus{Eins Zwei 3 Vier 5}
>
Wie wäre denn ein split /\s+/ des Inhalts von {}? Anschließend
könntest Du jedes Array-Element separat behandeln, also sinngemäß

#!/usr/bin/perl -w

use strict;

my $zeile = '\plus{eins zwei 3 vier 5}';

$zeile =~ s/^.*\{(.*)\}/$1/;
my @inhalt = split /\s+/, $zeile;

for my $element (@inhalt) {
$element =~ s/([\D].+)/\u$1/;
}

print '\plus{' , join(' ',@inhalt), "}\n";

Re: Alle Anfangsbuchstaben als Großbuchstaben

am 20.06.2006 16:22:31 von hjp-usenet2

Christoph Bier wrote:
> ich habe in einer .tex-Datei ein LaTeX-Makro (\plus{}), in dem 1--5
> Wörter vorkommen können, die erstens alle (leider) kleingeschrieben
> sind und zweitens nicht nur Buchstaben enthalten können. All diese
> Wörter sollen aber mit einem Großbuchstaben beginnen. Genau diese
> Ersetzung gelingt mir aber nicht, da \u nur den Anfangsbuchstaben
> des /ersten/ Wortes ersetzt; zumindest in meinem vielleicht etwas
> naiven Beispiel:
>
> #----------------------------------------------
> #!/usr/bin/perl -w
> use strict;
>
> my $zeile = '\plus{eins zwei 3 vier 5}';
> $zeile =~ s/(\\plus)\{([\d\D]+)\}/$1\{\u$2\}/g;

Da ersetzt Du das erste Zeichen nach der {, das entweder eine Ziffer oder
keine Ziffer ist (also jedes) durch den entsprechenden Großbuchstaben.

> print "$zeile \n";
> #-----------------------------------------------
>
> Als Ergebnis brauche ich: \plus{Eins Zwei 3 Vier 5}

Es gibt wahrscheinlich einen gefinkelten Einzeiler, der das Problem
löst. Nachdem mir aber ad-hoc keiner einfällt und er wahrscheinlich
ohnehin nicht besonders einfach zu verstehen wäre, zerlegen wir das
Problem im mehrere Teilprobleme:

1. Von jeder Zeile wollen wir das Argument von von \plus (nennen wir es
$plusarg) verändern, das was davor und danach kommt ($prae, $post)
aber unverändert übernehmen:

if ($zeile =~ /(.*\\plus{)(.*?)(}.*)/) {
my ($prae, $plusarg, $post) = ($1, $2, $3);

2. In $plusarg, wollen wir das jeweils erste Zeichen jedes Worts
(das ist das erste Wort-Zeichen, vor dem eine Wortgrenze war)
großschreiben;

$plusarg =~ s/\b(\w)/\u$1/g;

3. Dann können wir die Teile wieder zusammensetzen:

$zeile = "$prae$plusarg$post";
}

Die Erweiterung auf den Fall, dass \plus{} mehrmals pro Zeile vorkommt,
sei Dir als Übungsaufgabe überlassen.

hp

--
_ | Peter J. Holzer | Man könnte sich [die Diskussion] auch
|_|_) | Sysadmin WSR/LUGA | sparen, wenn man sie sich einfach sparen
| | | hjp@hjp.at | würde.
__/ | http://www.hjp.at/ | -- Ralph Angenendt in dang 2006-04-15

Re: Alle Anfangsbuchstaben als Großbuchstaben

am 20.06.2006 18:32:35 von Christoph Bier

Christian Kirsch schrieb am 20.06.2006 15:56:

> Christoph Bier schrieb:
>
>>Hallo zusammen,
>>
>>ich habe in einer .tex-Datei ein LaTeX-Makro (\plus{}), in dem 1--5
>>Wörter vorkommen können, die erstens alle (leider) kleingeschrieben
>>sind und zweitens nicht nur Buchstaben enthalten können. All diese
>>Wörter sollen aber mit einem Großbuchstaben beginnen. Genau diese
>>Ersetzung gelingt mir aber nicht, da \u nur den Anfangsbuchstaben
>>des /ersten/ Wortes ersetzt; zumindest in meinem vielleicht etwas
>>naiven Beispiel:
>>
>>#----------------------------------------------
>>#!/usr/bin/perl -w
>>use strict;
>>
>>my $zeile = '\plus{eins zwei 3 vier 5}';
>>$zeile =~ s/(\\plus)\{([\d\D]+)\}/$1\{\u$2\}/g;
>>print "$zeile \n";
>>#-----------------------------------------------
>>
>>Als Ergebnis brauche ich: \plus{Eins Zwei 3 Vier 5}
>
> Wie wäre denn ein split /\s+/ des Inhalts von {}? Anschließend
> könntest Du jedes Array-Element separat behandeln, also sinngemäß
>
> #!/usr/bin/perl -w
>
> use strict;
>
> my $zeile = '\plus{eins zwei 3 vier 5}';
>
> $zeile =~ s/^.*\{(.*)\}/$1/;
> my @inhalt = split /\s+/, $zeile;
>
> for my $element (@inhalt) {
> $element =~ s/([\D].+)/\u$1/;
> }
>
> print '\plus{' , join(' ',@inhalt), "}\n";

Vielen Dank! Ich denke, ich habe es verstanden; es wird sich zeigen,
wenn ich das jetzt auf mein konkretes Problem übertrage (ich möchte
den Dateinamen über die Kommandozeile übergeben).

Beste Grüße,
Christoph
--
+++ Typografie-Regeln: http://www.zvisionwelt.de/typokurz.pdf (1.4)

Re: Alle Anfangsbuchstaben als Großbuchstaben

am 20.06.2006 18:34:02 von Christoph Bier

Peter J. Holzer schrieb am 20.06.2006 16:22:

[kommentierter Lösungsvorschlag]

Vielen Dank! Ich werde jetzt erst mal versuchen Deinen Vorschlag zu
verstehen.

> Die Erweiterung auf den Fall, dass \plus{} mehrmals pro Zeile vorkommt,
> sei Dir als Übungsaufgabe überlassen.

\plus{} kommt in der Tat mehrmals pro Zeile vor :-).

Beste Grüße,
Christoph
--
+++ Typografie-Regeln: http://www.zvisionwelt.de/typokurz.pdf (1.4)