Фильтр Pandoc Lua для замены определенных английских слов на китайские слова в цитатах

При написании статьи на китайском языке можно цитировать статьи как на китайском, так и на английском языке. Однако стили немного отличаются. Пример выглядит следующим образом:

Cite an English article (Smith et al. 2022), and cite a Chinese article (张三 等 2018).

Другими словами, для статей с несколькими авторами et al. используется для статей на английском языке, а 等 применяется для статей на китайском языке. Учитывая, что Язык стиля цитирования не может работать с несколькими языками, я бы попросил помощи для фильтра Lua.

Файл Markdown с именем test.md в качестве примера:

Cite an English article [@makarchev2022], and cite a Chinese article [@luohongyun2018].

Затем выполните команду ниже:

pandoc -C -t native test.md

И вывод основного тела:

[ Para
    [ Str "Cite"
    , Space
    , Str "an"
    , Space
    , Str "English"
    , Space
    , Str "article"
    , Space
    , Cite
        [ Citation
            { citationId = "makarchev2022"
            , citationPrefix = []
            , citationSuffix = []
            , citationMode = NormalCitation
            , citationNoteNum = 1
            , citationHash = 0
            }
        ]
        [ Str "(Makarchev"
        , Space
        , Str "et"
        , Space
        , Str "al."
        , Space
        , Str "2022)"
        ]
    , Str ","
    , Space
    , Str "and"
    , Space
    , Str "cite"
    , Space
    , Str "a"
    , Space
    , Str "Chinese"
    , Space
    , Str "article"
    , Space
    , Cite
        [ Citation
            { citationId = "luohongyun2018"
            , citationPrefix = []
            , citationSuffix = []
            , citationMode = NormalCitation
            , citationNoteNum = 2
            , citationHash = 0
            }
        ]
        [ Str "(\32599\32418\20113"
        , Space
        , Str "et"
        , Space
        , Str "al."
        , Space
        , Str "2018)"
        ]
    , Str "."
    ]

Поскольку @luohongyun2018 — это китайская библиография, я хочу заменить последнюю английскую et al., которая следовала за ней, т. е.:

, Str "et"
, Space
, Str "al."

К китайскому слову 等:

, Str "\31561"

Можно ли это сделать через фильтр Lua? Следуя примеру на странице Lua filter, я пробовал, но сам не смог.

Мы ценим любые предложения. Заранее спасибо.

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Приведенный ниже фильтр выполняет две функции: проверяет, содержит ли текст цитаты китайские иероглифы, и если да, то продолжает заменять et al..

Тест китайских иероглифов немного хрупкий; его можно сделать более надежным, используя вместо этого функцию utf8.codepoint из стандартной библиотеки Lua.

function Cite (cite)
  return cite:walk{
    Inlines = function (inlines)
      local has_cjk = false
      inlines:walk {
        Str = function (s)
          has_cjk = has_cjk or
            pandoc.layout.real_length(s.text) > pandoc.text.len(s.text)
        end
      }
      -- do nothing if this does not contain wide chars.
      if not has_cjk then
        return nil
      end

      local i = 1
      local result = pandoc.Inlines{}
      while i <= #inlines do
        if i + 2 <= #inlines and
          inlines[i].text == 'et' and
          inlines[i+1].t == 'Space' and
          inlines[i+2].text == 'al.' then
          result:insert(pandoc.Str '等')
          i = i + 3
        else
          result:insert(inlines[i])
          i = i + 1
        end
      end
      return result
    end
  }
end

Огромное спасибо! Я пробовал, и это сработало. Для различения китайских и английских цитат я обнаружил, что Str перед et al. сложно. Для цитирования на английском языке это оригинальные символы ASCII, как правило, фамилия первого автора, например Makarchev. В то время как для китайской цитаты Str перед et al. — это символ, представленный идентификатором Юникода, например \32599\32418\20113. Может ли это быть потенциальным способом определения языка?

TomBen 20.11.2022 16:15

На странице фильтров Pandoc Lua есть функция под названием real_length (str), которая возвращает реальную длину строки в моноширинном шрифте: 0 для комбинированного символа, 1 для обычного символа, 2 для восточноазиатского широкого символа. Как это можно использовать здесь?

TomBen 20.11.2022 16:34

Это сработало! Однако, если --metadata link-citations=true был установлен для вывода docx, он не смог этого сделать.

TomBen 20.11.2022 18:26

И, похоже, это не сработало, когда был применен пользовательский CSL. Но для стандартного chicago-author-date style это сработало, как и ожидалось.

TomBen 21.11.2022 03:09

Проблему link-citations можно решить, позволив фильтру «ходить» cite.content, чтобы заменить et al.. Я попробую сделать это позже. Не уверен насчет пользовательского CSL, не могли бы вы опубликовать дополнительную информацию? (Возможно, это должно войти в новый вопрос.)

tarleb 21.11.2022 07:11

Например, если был применен стиль APA: --csl=apa.csl, этот фильтр Lua не работал для вывода docx. Если файл CSL был удален, он работал хорошо.

TomBen 21.11.2022 08:56

Не могли бы вы помочь исправить проблему, когда link-citations включен и применяется пользовательский CSL? Спасибо!

TomBen 29.11.2022 14:40

Другие вопросы по теме