При написании статьи на китайском языке можно цитировать статьи как на китайском, так и на английском языке. Однако стили немного отличаются. Пример выглядит следующим образом:
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, я пробовал, но сам не смог.
Мы ценим любые предложения. Заранее спасибо.
Приведенный ниже фильтр выполняет две функции: проверяет, содержит ли текст цитаты китайские иероглифы, и если да, то продолжает заменять 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
На странице фильтров Pandoc Lua есть функция под названием real_length (str), которая возвращает реальную длину строки в моноширинном шрифте: 0 для комбинированного символа, 1 для обычного символа, 2 для восточноазиатского широкого символа. Как это можно использовать здесь?
Это сработало! Однако, если --metadata link-citations=true был установлен для вывода docx, он не смог этого сделать.
И, похоже, это не сработало, когда был применен пользовательский CSL. Но для стандартного chicago-author-date style это сработало, как и ожидалось.
Проблему link-citations можно решить, позволив фильтру «ходить» cite.content, чтобы заменить et al.. Я попробую сделать это позже. Не уверен насчет пользовательского CSL, не могли бы вы опубликовать дополнительную информацию? (Возможно, это должно войти в новый вопрос.)
Например, если был применен стиль APA: --csl=apa.csl, этот фильтр Lua не работал для вывода docx. Если файл CSL был удален, он работал хорошо.
Не могли бы вы помочь исправить проблему, когда link-citations включен и применяется пользовательский CSL? Спасибо!
Огромное спасибо! Я пробовал, и это сработало. Для различения китайских и английских цитат я обнаружил, что Str перед et al. сложно. Для цитирования на английском языке это оригинальные символы ASCII, как правило, фамилия первого автора, например Makarchev. В то время как для китайской цитаты Str перед et al. — это символ, представленный идентификатором Юникода, например \32599\32418\20113. Может ли это быть потенциальным способом определения языка?