org-modeで*をエスケープして太字のフォント化を防ぐにはどうすればよいですか


12

*shrug*組織モードのように書くと、太字のテキストとして自動的にフォント化されます。どうすればそれを防ぐことができ*shrug*ますか。つまり、エクスポート時に実際に逐語的に表示されますか?

編集:

私はまだ太字フォントを使用できるようにしたい(太字テキストのデフォルトのスター構文を変更する必要はありません)、そして組織ファイルがどのファイル形式にエクスポートされるかは問題ではありません。例えば、HTMLだけでなくMarkdownでも動作します書き出す。

これはいくつかの重要な要素であるため、太字で書かれています。しかし、何か他のもののために、私はアイデア* shrug *を持っていません。


1
これを後でLaTeXにエクスポートする場合、\ast{}shrug\ast{}またはを試してみることができます\star{}shrug\star{}。同様にHTMLでエンティティエンコードを使用できます:&#2a;、またはアスタリスクの前後にスペースを追加することがオプションの場合、これも機能します。
wvxvw

それを逐語的なマーカーで包むというスバユの答えがあなたが望むもののようです。または、org-emphasis-alistを変更して、別の文字を使用してテキストを太字にすることもできます。
user2699

ではない正確に。= * shrug * =の結果、エクスポートされたHTMLはcode-tagでラップされ、マークダウンにはバックティックが含まれます。まったくフォーマットされていないことを望みます。
timor

org-emphasis-alistを変更することは実際には選択肢ではないことを反映するように質問を編集しました。.orgファイルに既に存在する太字のすべてを変更したくありません。
timor

2
\ast{}shrug\ast{}wvxvw言及は、おそらくあなたの最良の選択肢です。適切な文字エンティティを使用∗shrug∗してhtml としておよびlatex にエクスポートし$\ast$shrug$\ast$ます。org-toggle-pretty-entities組織バッファにUTF8文字として表示します。
mutbuerger

回答:


9

この答えは、emacs-org-mode GNUリストでのゼロ幅のスペース文字の代わりにorg-entityC-h i g (org) Special symbols)を使用するという集合的な提案の後、インスピレーションを得ています(他の答えはこちらで提案しました)。\ast{}

以下は、ユーザーがさまざまなシンボルの組織エンティティを覚える必要のない一般的なソリューションです。ユーザーが行うと、組織エンティティー(使用可能な場合)を挿入しC-u SYMBOLます。作品のためC-u *C-u /C-u =、など

(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)

ユーザタイプは、ときにC-u *\ast{}挿入され、メッセージ下エコー領域に表示され、

シンボル*に 'org-entity' \ ast {}を挿入しました。

場合org-pretty-entitiesに設定されているt、上記挿入\ast{}される表示として*

org-entity文字Xに存在せず、ユーザーがC-u Xを実行する場合、Xは単純に4回挿入されます(C-u通常のように)。


1
これは本当に便利に見えます。残っている(私の意見では)1つのdrwabackは、これまでLaTeX構造を含まない.orgファイルには、ファイル全体に散らばった非組織モード構文(LaTeX)のビットがあります。ちなみに、このような構造が\*thisisnotbold\*存在しない理由はありますか?
timor

1
これも組織の構文です。org-entitiesドキュメントをご覧ください。
カウシャルモディ

8

ZERO WIDTH SPACE unicode charを使用する

最初のアスタリスクの前または2番目のアスタリスクの後にゼロ幅のスペース文字(以下のスニペットで[ZWS]で示される)を追加することにより、太字の強調解析に失敗する可能性があります。

私のテストでは、以下のスニペットの両方がHTMLに正常にエクスポートされました。

  • [ZWS] 最初のアスタリスクの

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] 2番目のアスタリスクの

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

を実行すると、ZERO WIDTH SPACE(ユニコード名)を入力できますC-x 8 RET 200b RET
私はこれを非常に頻繁に使用するため、これをにバインドしましたC-x 8 0


更新

emacs-org-modeメーリングリスト議論によると、エスケープに非ASCII文字を使用することは推奨されていません。代わりにorg-entities、該当する場合に使用する必要があります。私もそれに同意し、挿入を非常に簡単にするこの別のソリューションを考え出しましたorg-entitiesC-u *この場合)。


技術的には、問題を解決するための非常に迅速な方法です。ZWSを空白として解釈しないorg-modeに依存していますか?また、解決策は組織ファイルを編集している他の人にとっては明白ではないことを恐れています...
timor

@timor emacs-orgmode@gnu.orgメーリングリストでこの議論を取り上げました。興味がある場合は、こちらのディスカッションをフォロー/追加できます。
カウシャルモディ

@timor、それは明らかではありませんが、ここに示されているすべてのソリューションの中で、emacs構成を変更せずに動作する唯一のソリューションですので、ファイルを共有したい場合は最も明白です。
user2699

@ user2699 FWIW、ファイル内での組織エンティティの使用は、ユーザー設定なしですぐ\ast{}に機能します。ファイル内でプレーンASCII を使用するだけです。私の他のソリューションは、入力を\ast{}より速く、覚えやすくするだけです。
カウシャルモディ

3

逐語的に言えば、エクスポートされたLaTeXで実際にマークアップを使用することを意味する場合は、単にを使用できます=*shrug*=。ただし、としてエクスポートするだけで*shrug*、これを常に実行する場合は、filtersをお勧めします。ただし、の一部のインスタンスでのみこれが必要な場合は、*shrug*@ wvxvwによって提案された代替手段を使用する必要があります。マクロを使用してこれをきれいに行うことができます。次に例を示します。

フィルター

(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)

本質的に、上記のフィルターは\textbf{..}トランスコードされた文字列内のマークアップを探し、\ast{}..\ast{}内部でラップされたものを変更せずにそれをに置き換え{..}ます。正規表現と置換文字列のテストは行っていないため、間違いがある可能性がありますが、アイデアは得られます。同様に、他のバックエンドをカバーするために、次のような追加のスニペットを含めることができます。

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

上記の正規表現についても同じ注意が必要です。

マクロ

組織ソース:

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

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

次のようにLaTeXにエクスポートします。

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

およびHTMLとして:

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

もちろん、必要な数のバックエンドをマクロに追加できます。

編集: Kaushalがコメントで指摘しているように、この場合、ラテックスのエクスポートスニペットはオプションです。ただしorg-entities、Orgソースでベアラテックスを識別するためのリストと特定のルールを追跡するのはかなり難しいので、ベアラテックスが関係する場合は常に使用することを好みます。

注意:

  • フィルタの例はテストされていませんが、
  • 私は知らないHTMLので、それぞれのビットにいくつかの間違いがあるかもしれません。

このマクロ定義では十分ではありません:#+macro: nobold \ast{}$1\ast{}?list astのメンバーの1つでありorg-entities、latex、html、asciiなどのエクスポートの外観を指定します("ast" "\\ast" t "&lowast;" "*" "*" "*")。そのリストの要素の順序は、「名前、LaTeX置換、LaTeX mathp、HTML置換、ASCII置換、Latin1置換、utf-8置換」です。
カウシャルモディ

@kaushalmodiはい、ありますが、LaTeXであることはすでにわかっているので、ラテックススニペットに入れても害はありません。私の経験では、スニペットの使用は明確であるため、はるかに堅牢です。
スバユ

-1

これは変数org-emphasis-alistによって制御され、簡単に変更できます。

  • 太字のテキストの上にポイントを置き、コマンドwhat-c​​ursor-position C-u C-x =を使用して顔を見つけますorg-emphasis。プロパティがあることに注意してください。
  • customize-grouporg-emphasisの呼び出しと検索
  • org-emphasis-alistが表示され、テキストをマークするためのさまざまなオプションが表示されます。
  • *に対応するエントリを削除します
  • 変更を適用し、org-modeまたはemacsを再起動します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.