Wie kann ich mich im org-Modus aus dem * entfernen, um fett gedruckte Schriften zu vermeiden?

12

Wenn ich so etwas wie *shrug*im Org-Modus schreibe , wird es automatisch als fetter Text angezeigt . Wie kann ich verhindern, dass *shrug*das beim Exportieren tatsächlich wörtlich erscheint?

Bearbeiten:

Ich möchte weiterhin in der Lage sein, Fettschrift zu verwenden (ohne die Standard-Sternsyntax für Fettschrift ändern zu müssen), und es sollte keine Rolle spielen, in welches Dateiformat meine Organisationsdatei exportiert wird, z. B. sollte es für Markdown und HTML funktionieren Export.

Das sind einige wichtige Dinge, deshalb ist es fett geschrieben. Aber für etwas anderes habe ich keine Ahnung * Achselzucken *.

Timor
quelle
1
Wenn Sie später diese zu LaTeX exportieren, könnten Sie versuchen , \ast{}shrug\ast{}oder \star{}shrug\star{}, ähnlich, mit HTML können Sie Entity - Codierung verwenden: &#2a;, oder wenn das Hinzufügen Leerzeichen vor oder nach dem Sternchen eine Option, auch das funktionieren würde.
wvxvw
Es scheint, als ob Suvayus Antwort, es nur in wörtliche Markierungen zu hüllen, das ist, was Sie wollen. Alternativ können Sie die org-emphasis-alist so ändern, dass ein anderes Zeichen zum Fettdruck von Text verwendet wird.
user2699
Nicht genau. = * achselzucken * = führt dazu, dass der exportierte HTML- codeCode in ein -Tag eingeschlossen wird und Abschriften Backticks enthalten. Ich möchte, dass es überhaupt nicht formatiert wird.
Timor
Überarbeitete Frage, um zu reflektieren, dass das Ändern der Org-Betonungsliste keine Option ist. Ich möchte nicht alles Fettgedruckte ändern, das bereits in meiner .org-Datei vorhanden ist.
Timor
2
Das \ast{}shrug\ast{}von wvxvw erwähnte ist wahrscheinlich die beste Option. Es exportiert nach HTML als ∗shrug∗und nach Latex unter $\ast$shrug$\ast$Verwendung der entsprechenden Zeicheneinheiten. org-toggle-pretty-entitiesZeigt sie als UTF8-Zeichen im Organisationspuffer an.
Mutbuerger

Antworten:

9

Diese Antwort wurde nach kollektiven Vorschlägen in der GNU-Liste für den emacs-org-mode inspiriert , die org-entity( C-h i g (org) Special symbols) \ast{}anstelle von Leerzeichen mit null Breite zu verwenden (die ich in meiner anderen Antwort hier vorgeschlagen habe ).

Im Folgenden finden Sie eine allgemeine Lösung, bei der der Benutzer sich die Organisationsentitäten für verschiedene Symbole nicht merken muss. Es fügt die Organisationsentität (falls verfügbar) ein, wenn der Benutzer dies tut C-u SYMBOL. arbeitet für C-u *, C-u /, C-u =etc.

(defun modi/org-entity-get-name (char)
  "Return the entity name for CHAR. For example, return \"ast\" for *."
  (let ((ll (append org-entities-user
                    org-entities))
        e name utf8)
    (catch 'break
      (while ll
        (setq e (pop ll))
        (when (not (stringp e))
          (setq utf8 (nth 6 e))
          (when (string= char utf8)
            (setq name (car e))
            (throw 'break name)))))))

(defun modi/org-insert-org-entity-maybe (&rest args)
  "When the universal prefix C-u is used before entering any character,
    insert the character's `org-entity' name if available.

    If C-u prefix is not used and if `org-entity' name is not available, the
    returned value `entity-name' will be nil."
  ;; It would be fine to use just (this-command-keys) instead of
  ;; (substring (this-command-keys) -1) below in emacs 25+.
  ;; But if the user pressed "C-u *", then
  ;;  - in emacs 24.5, (this-command-keys) would return "^U*", and
  ;;  - in emacs 25.x, (this-command-keys) would return "*".
  ;; But in both versions, (substring (this-command-keys) -1) will return
  ;; "*", which is what we want.
  ;; http://thread.gmane.org/gmane.emacs.orgmode/106974/focus=106996
  (let ((pressed-key (substring (this-command-keys) -1))
        entity-name)
    (when (and (listp args) (eq 4 (car args)))
      (setq entity-name (modi/org-entity-get-name pressed-key))
      (when entity-name
        (setq entity-name (concat "\\" entity-name "{}"))
        (insert entity-name)
        (message (concat "Inserted `org-entity' "
                         (propertize entity-name
                                     'face 'font-lock-function-name-face)
                         " for the symbol "
                         (propertize pressed-key
                                     'face 'font-lock-function-name-face)
                         "."))))
    entity-name))

;; Run `org-self-insert-command' only if `modi/org-insert-org-entity-maybe'
;; returns nil.
(advice-add 'org-self-insert-command :before-until #'modi/org-insert-org-entity-maybe)

Wenn der Benutzer eingibt C-u *, \ast{}wird die folgende Meldung im Echobereich angezeigt.

'Org-entity' \ ast {} für das Symbol * eingefügt.

Wenn org-pretty-entitieseingestellt ist toben, das eingefügt \ast{}wird , angezeigt , wie *.

Existiert org-entityfür ein Zeichen X kein a und tut der Benutzer C-u X , wird X einfach viermal eingefügt (wie C-unormalerweise).

Kaushal Modi
quelle
1
Das sieht sehr praktisch aus. Der einzige Nachteil (meiner Meinung nach) ist, dass die .org-Datei, die bisher keine LaTeX-Konstrukte enthält, jetzt über Teile der Nicht-Org-Modus-Syntax (LaTeX) in der Datei verteilt ist. Gibt es übrigens einen Grund, warum es kein solches Konstrukt \*thisisnotbold\*gibt?
Timor
1
Dies ist auch die org-Syntax. Lesen Sie die org-entitiesDokumentation.
Kaushal Modi
8

Verwenden des ZERO WIDTH SPACE-Unicode-Zeichens

Sie können die fett gedruckte Hervorhebungsanalyse durch Hinzufügen eines Leerzeichens mit der Breite Null (angezeigt durch [ZWS] in den folgenden Ausschnitten) vor dem ersten Sternchen oder nach dem zweiten Sternchen fehlschlagen.

Die beiden folgenden Snippets wurden in meinen Tests problemlos in HTML exportiert:

  • [ZWS] vor dem ersten Stern

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] nach dem zweiten Stern

    This is some *bold* test and this is *not bold*​[ZWS].
    

Sie können den ZERO WIDTH SPACE (Unicode-Name) eingeben, indem Sie dies tun C-x 8 RET 200b RET.
Ich benutze dies sehr oft, deshalb habe ich dies gebundenC-x 8 0 .


Aktualisieren

Gemäß der Diskussion in der Mailingliste im emacs-org-Modus wird die Verwendung von Nicht-ASCII-Zeichen für das Escape nicht empfohlen. org-entitiessollte stattdessen verwendet werden, falls zutreffend. Auch ich stimmte dem zu und fand eine andere Lösung , die das Einfügen org-entities( C-u *in diesem Fall) sehr einfach macht .

Kaushal Modi
quelle
Technisch ist das ein ziemlich schneller Weg, um das Problem zu lösen. Verlässt es sich darauf, dass der Organisationsmodus das ZWS nicht als Leerzeichen interpretiert? Außerdem befürchte ich, dass die Lösung für andere Personen, die die Organisationsdatei bearbeiten, nicht offensichtlich ist ...
timor
@timor Ich habe diese Diskussion auf die [email protected]Mailingliste gesetzt. Bei Interesse können Sie die Diskussion hier verfolgen / ergänzen .
Kaushal Modi
@timor, es ist nicht offensichtlich, aber von allen hier angegebenen Lösungen ist es die einzige, die ohne Änderung der Emacs-Konfiguration funktioniert. Daher ist es die offensichtlichste, wenn Sie Ihre Dateien freigeben möchten.
user2699
@ user2699 FWIW, die Verwendung von Organisationsentitäten in den Dateien funktioniert sofort ohne Benutzerkonfiguration. Es ist nur die Verwendung von einfachem ASCII \ast{}in den Dateien. Meine andere Lösung macht die Eingabe einfach \ast{}schneller und einfacher zu merken.
Kaushal Modi
3

Wenn Sie wörtlich sagen, dass Sie im exportierten LaTeX tatsächlich ein Markup verwenden möchten, können Sie einfach verwenden =*shrug*=. Wenn Sie jedoch nur möchten, dass es exportiert wird *shrug*, und dies die ganze Zeit tun möchten, würde ich Filter empfehlen . Wenn Sie dies jedoch nur für einige Instanzen von benötigen *shrug*, sollten Sie die von @wvxvw vorgeschlagene Alternative verwenden. Sie könnten dies sauber mit Makros tun . Es folgen einige Beispiele.

Filter

(defun my-bold (contents backend info)
  (when (org-export-derived-backend-p backend 'latex)
    (replace-regexp-in-string "\\`\\\\textbf{\\(.+\\)}"
                              "\\\\ast{}\\1\\\\ast{}" contents)))

(add-to-list 'org-export-filter-bold-functions 'my-bold)

Im Wesentlichen sucht der obige Filter nach dem \textbf{..}Markup in der transkodierten Zeichenfolge und ersetzt es durch \ast{}..\ast{}, ohne den Inhalt zu ändern {..}. Ich habe den regulären Ausdruck und die Ersetzungszeichenfolge nicht getestet, daher kann es zu Fehlern kommen, aber Sie haben die Idee. Um auch andere Backends abzudecken, kann man zusätzliche Snippets wie dieses einfügen:

(when (org-export-derived-backend-p backend 'html)
   (replace-regexp-in-string "<b>\\(.+\\)</b>" "\&#2a;\\1\&#2a;" contents))

Gleiche Einschränkung gilt für den regulären Ausdruck oben.

Makros

Org source:

#+macro: nobold @@latex:\ast{}$1\ast{}@@ @@html:&#2a;$1&#2a;@@

This text is *bold* this is nobold{{{not}}}

exportiert nach LaTeX als:

This text is \textbf{bold} this is \ast{}not\ast{}

und zu HTML als:

This text is <b>bold</b> this is  &#2a;not&#2a;

Natürlich können Sie dem Makro beliebig viele Backends hinzufügen.

Bearbeiten: Wie Kaushal in den Kommentaren ausführt, ist das Export-Snippet für Latex in diesem Fall optional. Ich bevorzuge es jedoch, sie zu verwenden, wenn nackter Latex betroffen ist, da ich es ziemlich schwierig finde, die Liste org-entitiesund die spezifischen Regeln für die Identifizierung von nacktem Latex in der Org-Quelle zu verfolgen .

Hinweis:

  • die Filterbeispiele sind ungetestet,
  • Ich kenne keine HTML, daher kann es in den jeweiligen Bits zu Fehlern kommen.
suvayu
quelle
Sollte diese Makrodefinition nicht ausreichen #+macro: nobold \ast{}$1\ast{}? asteines der Mitglieder ist die org-entitiesListe, die angibt , welche der Latex, html, ascii, etc Exporte sollte wie folgt aussehen: ("ast" "\\ast" t "&lowast;" "*" "*" "*"). Die Reihenfolge der Elemente in dieser Liste lautet "Name, LaTeX-Ersetzung, LaTeX-Mathematik, HTML-Ersetzung, ASCII-Ersetzung, Latin1-Ersetzung, utf-8-Ersetzung".
Kaushal Modi,
@kaushalmodi Ja, aber da wir bereits wissen, dass es sich um LaTeX handelt, kann es nicht schaden, es in ein Latex-Snippet zu stecken. Nach meiner Erfahrung ist die Verwendung von Snippets aufgrund ihrer Eindeutigkeit wesentlich robuster.
Suvayu
-1

Dies wird durch die Variable org-emphasis-alist gesteuert und kann leicht geändert werden.

  • Platzieren Sie den Punkt über fettem Text, verwenden Sie den Befehl what-cursor-position C-u C-x =, um das Gesicht zu finden, und beachten Sie, dass es eine Eigenschaft hat org-emphasis.
  • Rufen Sie an customize-groupund suchen Sie nach org-emphasis
  • org-emphasis-alist sollte mit verschiedenen Optionen zum Markieren von Text angezeigt werden.
  • Löschen Sie den Eintrag, der * entspricht
  • Übernehmen Sie die Änderungen und starten Sie org-mode oder emacs neu
user2699
quelle