Как мне выйти из * в режиме org, чтобы избежать жирного шрифта

12

Если я напишу что-то похожее *shrug*на режим org, оно будет автоматически обозначено жирным шрифтом . Как я могу предотвратить это, то есть фактически *shrug*появиться дословно при экспорте?

Редактировать:

Я все еще хочу иметь возможность использовать жирный шрифт (без необходимости изменять звездный синтаксис по умолчанию для жирного текста), и не должно иметь значения, в какой формат экспортируется мой файл org, например, он должен работать как для Markdown, так и для HTML экспорт.

Это важная вещь, поэтому она написана жирным шрифтом. Но для чего-то другого у меня нет идеи * пожимает плечами *.

Тимору
источник
1
Если вы экспортируете это в LaTeX позже, вы можете попробовать \ast{}shrug\ast{}или \star{}shrug\star{}, аналогично, с HTML вы можете использовать кодировку сущности: &#2a;или, если добавление пробелов до или после звездочки является опцией, это тоже будет работать.
wvxvw
Похоже, что ответ suvayu просто завернуть его в дословные маркеры, что вы хотите. Кроме того, вы можете изменить org-emphasis-alist, чтобы другой символ использовался для полужирного текста.
user2699
Не совсем. = * shrug * = приводит к тому, что экспортированный HTML- codeкод будет заключен в -tag, а в markdown есть обратные метки. Я хочу, чтобы это никак не форматировалось.
Тимор
Отредактированный вопрос, чтобы отразить, что изменение org-emphasis-alist на самом деле не вариант. Я не хочу менять все, что выделено жирным шрифтом в моем файле .org.
Тимор
2
\ast{}shrug\ast{}Упоминается wvxvw, вероятно , ваш лучший вариант. он экспортирует в HTML как ∗shrug∗и в латекс, $\ast$shrug$\ast$используя соответствующие символьные объекты. org-toggle-pretty-entitiesотображает их как символы UTF8 в буфере организации.
Mutbuerger

Ответы:

9

Этот ответ вдохновлен после коллективных предложений по списку GNU Emacs-орг-режим использования org-entity( C-h i g (org) Special symbols) \ast{}вместо нулевой шириной пространства символов (которые я предложил в моем другом ответе здесь ).

Ниже приведено общее решение, при котором пользователю не нужно запоминать сущности org для различных символов. Он вставляет сущность org (если она доступна), когда это делает пользователь 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{}будет отображаться как *.

Если an org-entityне существует для символа X и если пользователь делает C-u X , X просто вставляется 4 раза (как C-uэто обычно делается ).

Каушал Моди
источник
1
Это выглядит действительно удобно. Единственный оставшийся drwaback (по моему мнению), заключается в том, что файл .org, который до сих пор не содержит каких-либо конструкций LaTeX, теперь содержит биты синтаксиса не-орг-режима (LaTeX), разбросанные по всему файлу. Кстати, есть ли причина, по которой \*thisisnotbold\*такая конструкция не существует?
Тимор
1
Это тоже синтаксис org. Ознакомьтесь с org-entitiesдокументацией.
Каушал Моди
8

Использование символа ZERO WIDTH SPACE

Вы можете отменить выделение жирным шрифтом, добавив символ пробела нулевой ширины (обозначенный [ZWS] в приведенных ниже фрагментах) перед первой звездочкой или после второй звездочки.

В приведенном ниже тесте оба фрагмента кода экспортировались в HTML.

  • [ZWS] перед первой звездочкой

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] после второй звездочки

    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-entitiesдействительно простой ( C-u *в данном случае).

Каушал Моди
источник
Технически это довольно быстрый способ решения проблемы. Полагается ли он на то, что режим org не интерпретирует ZWS как пробел? Кроме того, я боюсь, что решение для других людей, редактирующих файл org, не является
очевидным
@timor Я поднял эту дискуссию в emacs-orgmode@gnu.orgсписке рассылки. Если интересно, можете следить / добавлять к обсуждению здесь .
Каушал Моди
@timor, это не очевидно, но из всех приведенных здесь решений это единственное, которое работает без изменения конфигурации emacs, поэтому оно наиболее очевидно, если вы хотите поделиться своими файлами.
user2699
@ user2699 FWIW, использование сущностей org в файлах будет работать сразу же без какой-либо настройки пользователя ... это просто использование простого ascii \ast{}в файлах. Мое другое решение просто делает ввод \ast{}быстрее и легче запомнить.
Каушал Моди
3

Дословно, если вы на самом деле имеете в виду использовать некоторую разметку в экспортированном LaTeX, то вы можете просто использовать =*shrug*=. Однако, если вы просто хотите, чтобы он экспортировался как *shrug*, и вы хотите делать это все время, я бы порекомендовал фильтры . Однако если вам это нужно только для некоторых случаев *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;

Конечно, вы можете добавить в макрос столько бэкэндов, сколько пожелаете.

Редактировать: как указывает Каушал в комментариях, фрагмент экспорта для латекса в данном случае является необязательным. Однако я предпочитаю использовать их всякий раз, когда задействован голый латекс, так как мне довольно сложно отслеживать список org-entitiesи конкретные правила определения голого латекса в источнике Org.

Замечания:

  • примеры фильтров не проверены,
  • Я не знаю ничего HTML, поэтому могут быть некоторые ошибки в соответствующих битах.
Quarky
источник
Разве этого определения макроса не достаточно #+macro: nobold \ast{}$1\ast{}? astявляется одним из членов org-entitiesсписка, который определяет, как должны выглядеть экспорты из латекса, html, ascii и т ("ast" "\\ast" t "&lowast;" "*" "*" "*"). д . : Порядок элементов в этом списке: «имя, замена LaTeX, математика LaTeX, замена HTML, замена ASCII, замена Latin1, замена utf-8».
Каушал Моди
@kaushalmodi Да, было бы, однако, поскольку мы уже знаем, что это LaTeX, нет ничего плохого в том, чтобы поместить его в фрагмент латекса. По моему опыту, использование сниппетов намного надежнее из-за его однозначности.
Quarky
-1

Это контролируется переменной org-emphasis-alist и может быть легко изменено.

  • Наведите курсор на жирный текст, используйте команду what-cursor-position, C-u C-x =чтобы найти лицо, обратите внимание, что у него есть свойство org-emphasis.
  • Звоните customize-groupи ищите орг-акцент
  • Должен появиться org-emphasis-alist с различными вариантами пометки текста.
  • Удалить запись, соответствующую *
  • Примените изменения и перезапустите org-mode или emacs
user2699
источник