Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

LaTeX-Cracks: Automatische Silbentrennung für camelCase?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 03.06.2012, 23:54    Titel: LaTeX-Cracks: Automatische Silbentrennung für camelCase? Antworten mit Zitat

Hi

ich schreibe ein LaTeX-Dokument, in dem ich viele Stellen der Form:
Code:
Blafasel wird durch die Funktion \sym{MeineKlasse::eineFunktionMitLangemNamen()} getriggert...

habe. (allerdings ein englisches Dokument, falls das zur Sache tut)

\sym ist definiert als äquivalent zu \texttt momentan.

Jetzt habe ich aber das Problem, das dieses ganze riesige "MeineKlasse::eineFunktion..." ungetrennt gesetzt wird, notfalls weit über den Rand des Papiers hinaus.

per \hyphenation das bekannt zu machen funktioniert leider auch nicht, da \hyphenation keine non-letters will, (also insbesondere kein "::"), aber sonst nicht funktioniert (\hyphenation{Meine-Klasse eine-Funktion-Blah} hilft nur, wenn ich das :: durch ein Leerzeichen ersetze, was ich nicht will).

An jeder Stelle \sym{Meine\-Klasse::\-eine\-Funktion\-Blafasel} zu schreiben ist auch nicht das wahre, da ich das sehr, sehr oft machen muss.

Ich suche nun eine Lösung, wie ich mein \sym so definieren kann, dass innerhalb der geschweiften Klammern die "normale" Silbentrennung idealerweise über Bord geworfen wird, und genau nach "::", nach "_", es sei denn der "_" ist ein führender "_" (*), und zwischen camel-Case Stellen getrennt wird. Ich bin ziemlich sicher, dass das mit LaTeX irgendwie möglich ist, da es ja an sich Turing-vollständig ist. Nur wie..?

*: es gibt auch Symbolnamen die_mit_underscores getrennt sind, deshalb möchte ich eine Trennung wie: die_\-mit_\-underscores. Allerdings gibt es auch Symbole, die mit "_" beginnen, deshalb möchte ich NICHT _\-symbol.

Wenn irgendjemand eine Idee hat möge er sie bitte mit mir teilen zwinkern

lg
flo

edit: google hat mir das hier gezeigt:

Code:

\usepackage{ifthen}

\makeatletter
\newcommand{\camelhyph}[1]{\@fterfirst\c@amelhyph#1\relax }
\def\@fterfirst #1#2{#2#1}
\def\c@amelhyph #1{%
 \ifthenelse{\equal{#1}\relax}{}{%  Do nothing if the end has been reached
   \ifnum`#1<91 \-#1\else#1\fi%     Check whether #1 is an uppercase letter,
                              %     if so, print \-#1, otherwise #1
  \expandafter\c@amelhyph%    %     insert \c@amelhyph again.
}}



allerdings geht das kaputt, wenn ich \camelhyph{\_blah} mache; er beschwert sich dann über "Argument of \x@protect has an extra }." bei
der zeile: "\camelhyph{PluginI::\_controlFifo}"

außerdem hätte ich gerne, dass er auch nach "::", und nach "_" (außer bei führenden "_" trennt); wobei dafür "_"s erst mal funktionieren sollten.

was geht da schief?
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 04.06.2012, 00:52    Titel: Antworten mit Zitat

wenn du willst dass es gut aussieht wirst du deine absätze so umbasteln müssen, dass so ein code-schnipsel einfach nie umgebrochen werden muss. Ein methodenname mit zeilenumbruch drin macht nämlich keinen spaß zu lesen.

ansonsten - wenns immer die selbe klasse::methode oder wie auch immer ist (oder nur ein paar wenige die oft wiederholt werden) mach dir ein \newcommand mit \sym{Meine\-Klasse::\-eine\-Funktion\-Blafasel} als content, dann brauchst du immer nur \cmdname schreiben und er fügt dir das ding auf einmal ein, die silbentrennung brauchst du dann nur einmal zu definieren. Sowas empfielt sich allgemein für häufig verwendete begriffe, spart teilweise einiges an tipparbeit einfach immer \aküfi zu schreiben als jedes mal Abkürzfimmel auszutippen und dann 20 davon mit rechtschreibfehlern zu versehen.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 04.06.2012, 07:52    Titel: Antworten mit Zitat

naja, es sind keine Codelistings sondern nur einzelne Codesymbole. Das soll ne Dokumentation werden, die beschreibt, wie gewisse Dinge im Code realisiert sind. Und dann bestimmt eben der Wert von \sym{BlaKlasse::blubbSymbol} das Verhalten von \sym{BlaKlasse:fooFunktion()}, worauf dann wieder etwas Fließtext folgt. Nachdem die Erklärung fertig ist, wird noch auf die Konstanten \sym{FOO} und \sym{BAR} hingewiesen...

in diesem Fall halte ich eine Silbentrennung von Symbolen für erträglich; v.a. angesichts der Alternative, entweder halbzeilige Löcher, oder abgeschnittenen Text zu haben...

es sind leider nicht einige wenige Symbole, mit \newcommand Abkürzungen zu definieren reicht also leider nicht...
_________________
MFG
Flo

Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.

zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 04.06.2012, 15:29    Titel: Antworten mit Zitat

Wenn das System MeineKlasse::eineFunktionMitLangemNamen() gleich bleibt, kannst du zumindest \sym so definieren, dass es aus zwei Parametern "MeineKlasse" und "eineFunktionMitLangemNamen()" deinen String zusammensetzt; dann solltest du zumindest einen optinalen Zeilenumbruch zwischen Klasse und Funktion hinbekommen. Für häufig vorkommende Funktionsnamen gäbe es dann noch die Möglichkeit einer globalen Anweisung zur Silbentrennung.

Für deine spezielle Anforderung müsste man wohl schon richtig in die TeX-Programmierung einsteigen; kannst ja eventuell mal ins TeXbook reinschauen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 07.06.2012, 22:55    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Wenn das System MeineKlasse::eineFunktionMitLangemNamen() gleich bleibt, kannst du zumindest \sym so definieren, dass es aus zwei Parametern "MeineKlasse" und "eineFunktionMitLangemNamen()" deinen String zusammensetzt; dann solltest du zumindest einen optinalen Zeilenumbruch zwischen Klasse und Funktion hinbekommen. Für häufig vorkommende Funktionsnamen gäbe es dann noch die Möglichkeit einer globalen Anweisung zur Silbentrennung.

das reicht leider nie im Leben, es gibt haufenweise verschiedener namen der form "LangerKlassenName::nochLaengererFunktionsName()" :/

ich hab mittlerweile folgendes zusammengegooglet und selbergehackt:
Code:

\makeatletter
\newcommand{\camelhyph}[1]{\@fterfirst\c@amelhyph#1\relax }
\newcommand{\underscorehyph}[1]{\@fterfirst\u@nderscorehyph#1\relax }
\def\@fterfirst #1#2{#2#1}
\def\c@amelhyph #1{%
\ifthenelse{\equal{#1}\relax}{}{%  Do nothing if the end has been reached
  \ifnum`#1=95 \_\hspace{0pt}\else      %     Check whether #1 is "_", then print _\-
    \ifnum`#1=58 :\hspace{0pt}\else
      \ifnum`#1>64
        \ifnum`#1<91 \-#1\else#1\fi%     Check whether #1 is an uppercase letter,
      \else#1\fi
    \fi
  \fi
                            %     if so, print \-#1, otherwise #1
  \expandafter\c@amelhyph%    %     insert \c@amelhyph again.
}}


das funktioniert schon mal angemessen gut. allerdings kann ich nicht schreiben:

Code:

\camelhyph{ein_symbol_mit_underscores}

sondern nur
Code:

\camelhyph{ein{\_}symbol{\_}mit{\_}underscores}


und die {} sind leider nötig

wenn jemand ne Möglichkeit kennt, die {}, oder idealerweise auch das \ weglassen zu können, wäre ich extrem dankbar lächeln


Außerdem fehlt mir noch, dass er irrsinnigLangerFunktionsname komplett richtig trennt.
momentan macht er irrsinnig-Langer-Funktionsname; ich hätte aber gerne:
irr-sin-nig-Lang-er-Funk-tions-na-me. die einzelnen Wortfragmente sollten also, soweit sie LaTeX bekannt sind, der eingebauten Silbentrennung zufolge getrennt werden...

geht das irgendwie?

lg
flo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 16.07.2012, 15:37    Titel: Antworten mit Zitat

Ich bin gerade, eher zufällig, über das Paket coolstr gestolpert, mit dem man Stringmanipulationen vornehmen kann - vielleicht lässt sich damit dein Problem mit den geschweiften Klammern in {\_} umgehen? Ich habe es nicht getestet.

Dass du was gegen die Backshlashes tun kannst, bezweifle ich - da wird LaTeX wohl immer erst einmal eine Schreibweise für die (mathematische) Tiefstellung dahinter vermuten. Es gibt zwar Umgebungen, in denen Zeichen so dargestellt werden wie sie eingegeben wurden; da wirst du dann wohl aber keine LaTaX-Befehle einbauen können (würde sich zumindest etwas widersprechen).

Für irr-sin-nig-Lang-er-Funk-tions-na-me müsstest du die interne Silbentrennung anbohren - wenn es möglich ist, aus den Ressourcen für das Wort "irrsinnig" die Trennung "irr\-sin\-nig" herauszufiltern, hast du halb gewonnen - keine Ahnung, ob so was möglich ist, ist nur mal ein Denkanstoß.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht 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.

 Impressum :: Datenschutz