|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 04.06.2012, 00:54 Titel: LaTeX-Cracks: Automatische Silbentrennung für camelCase? |
|
|
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
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 |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 04.06.2012, 01:52 Titel: |
|
|
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 |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 04.06.2012, 08:52 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 04.06.2012, 16:29 Titel: |
|
|
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 |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 07.06.2012, 23:55 Titel: |
|
|
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
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 16.07.2012, 16:37 Titel: |
|
|
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 |
|
|
|
|
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.
|
|