Wie kann man regelmäßig zitiert drehen (d‘„) in LaTeX / TeX Anführungszeichen (d `‘, `` '')

StackOverflow https://stackoverflow.com/questions/346567

  •  19-08-2019
  •  | 
  •  

Frage

ein Dokument geschrieben mit normalen Anführungszeichen angegeben ist, z.

Ben said "buttons, dear sir".
I replied "Did you say 'buttons'?" to him.

Welche Möglichkeiten kann man diese Art von Dingen in LaTeX Zitate, mit der entsprechenden Semantik drehen. d.

Ben said ``buttons, dear sir''.
I replied ``Did you say `buttons'?'' to him.

Damit LaTeX erzeugt:

Ben said “buttons, dear sir”.
I replied “Did you say ‘buttons’?”

Mein erster Gedanke ist zu einem regulären Ausdruck zu drehen. Aber ich bin keine Treffer von Google oder den Regex-Bibliotheken für „LaTeX Zitate regulärer Ausdruck“ bekommen, und natürlich „TeX zitiert regulären Ausdruck“ scheint zu viele zurückzukehren.

Danke.

War es hilfreich?

Lösung

In der Regel wird dieses Problem ist schwieriger als es aussieht.

Die einfachsten Fälle können mit regulären Ausdrücken behandelt werden, sondern auch für allgemeinere Situationen werden Sie fast sicherlich brauchen eine rekursive Parser zu bauen. Regulären Ausdruck wird nur funktionieren, wenn es keine Verschachtelung ist

Das große Problem bei der Identifizierung einzelnen "'"s in Verbindung gebracht werden wird, die nicht gepaart ist, --- wie Kontraktionen (die "'" in "don't" sollten nicht geändert werden, und sollte nicht kombiniert werden).


Hier können sehen, ob wir eine brauchbare EBNF Beschreibung schreiben können:

input:       text+
text:        uquote|squote|dquote
squote       "'" text "'"
dquote       """ text """
uquote:      [contraction|.]+
contraction: [A-Za-z]+ "'" [A-Za-z]+

, die zu Kontraktionen begrenzt ist, die die "'" in der Mitte des Wortes haben. All die damit verbundene Aktion wird echo nur die Eingabe, mit der Ausnahme, dass die squote und dquote Bedingungen ersetzen die Anführungszeichen als angemessen.


habe ich reguläre Ausdrücke durch menschliche Fix-ups für eine ziemlich einfache Einmal gefolgt, aber das arbeitsintensiv sein würde für die laufende Arbeit.

Andere Tipps

Hier ist der Python Regex, die ich für meine Latex-Dokumente verwenden:

'([ \w-]+)'", " `\\1'

Es ist ein Python-Skript, das die Regex auf einer Latex-Datei gilt ( hier ). Arbeitet die meiste Zeit. Glückliche Satz! :)

Hier sind einige Perl reguläre Ausdrücke Ersetzungen, die gut genug sein könnte für das, was Sie tun möchten.

s/"(\w)/``$1/g;
s/'(\w)/`$1/g;
s/([\w\.?!])"/$1''/g;

Der Code geht davon aus, dass eine einzelne oder doppelte Anführungszeichen durch einen alphanumerischen Zeichen folgt ein Zitat beginnt. Außerdem wird davon ausgegangen, dass ein doppeltes Anführungszeichen nach einem alphanumerischen Zeichen oder Satzzeichen ein Angebot endet. Diese Annahmen sind wohl wahr fast die ganze Zeit, aber es gibt auch Ausnahmen.

Danke für den Input -. Hilfreich und willkommen

Ich habe auch über diese kommen, von CPAN der Latex :: Encode.pm :

    # A single or double quote before a word character, preceded
    # by start of line, whitespace or punctuation gets converted
    # to "`" or "``" respectively.

    $text =~ s{ ( ^ | [\s\p{IsPunct}] )( ['"] ) (?= \w ) }
              { $2 eq '"' ? "$1``" : "$1`" }mgxe;

    # A double quote preceded by a word or punctuation character
    # and followed by whitespace or end of line gets converted to
    # "''".  (Final single quotes are represented by themselves so
    # we don't need to worry about those.)

    $text =~ s{ (?<= [\w\p{IsPunct}] ) " (?= \s | $ ) }
              { "''" }mgxe

Verwenden Sie keine regulären Ausdrücke für diese Art von Aufgabe!

Vielleicht können Sie etwas Inspiration erhalten von SmartyPants ?

Ich war auf der Suche nach einer Antwort auf dieses Problem und beschlossen, ein wenig Lisp heute zu lernen. Ich habe diese Lisp-Funktion in meiner ~ / .emacs-Datei und führen Sie dann mit M-x tex-set-quotes:

(defun tex-set-quotes ()  
  (interactive)  
  (latex-mode)  
  (while (search-forward "\"" nil t)  
   (replace-match "" nil t)  
   (tex-insert-quote nil)))

Einfach, verwendet `` für Angebote öffnen und '' zum Schließen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top