我想在 LaTeX 中创建一个命令,如下所示:
\chinese{炒面}
并让它创建一个脚注,其中包含编辑字典。
炒麵 炒面 [chao3 mian4] /stir-fried noodles/"chow mein"/
CC-EDICT 词典...
字典是可下载的文本文件,有约 118,000 行,例如
...
炒雞蛋 炒鸡蛋 [chao3 ji1 dan4] /scrambled eggs/
炒飯 炒饭 [chao3 fan4] /fried rice/(slang) (Tw) to have sex/
炒魷魚 炒鱿鱼 [chao3 you2 yu2] /(coll.) to fire sb/to sack sb/
炒麵 炒面 [chao3 mian4] /stir-fried noodles/"chow mein"/
...
第一个字是繁体中文,第二个字是简体中文。括号里是读音。斜线中间是释义。
我试过了\usepackage{datatool}
,它可以处理前 1000 行左右,但无法处理大约 118,000 行。它似乎试图将整个文件加载到内存中。
grep
我可以使用来grep " 炒面 " cedict_ts.u8
获取适合简体中文的行,但我不知道如何在 LaTeX 中做到这一点。
多重定义...
有时会有多个定义:
得 得 [de2] /to obtain/to get/to gain/to catch (a disease)/proper/suitable/proud/contented/to allow/to permit/ready/finished/
得 得 [de5] /structural particle: used after a verb (or adjective as main verb), linking it to following phrase indicating effect, degree, possibility etc/
得 得 [dei3] /to have to/must/ought to/to need to/
理想情况下,这些都应该被包括在内,并以某种方式分开。
问题:如何从 CC-EDICT 词典中提取中文单词的定义?
答案1
我为 LuaLaTeX 创建了一个简单的包ccedict.sty
::
\ProvidesPackage{ccedict}
\RequirePackage{luacode}
\RequirePackage{luatexja-fontspec}
\setmainjfont{FandolSong}
\begin{luacode*}
local dict = {}
function load_ccedict(filename)
for line in io.lines(filename) do
local traditional, simplified, spelling, description = line:match("^(.+)%s+(.+)%s+%[(.-)%]%s*(.+)")
if traditional then
-- insert new record for the current header
local rec = dict[simplified] or {}
table.insert(rec, {spelling = spelling, description = description, simplified = simplified, traditional = traditional})
dict[simplified] = rec
end
end
end
function ccedict_get_term(term)
local rec = dict[term] or {{spelling="cannot find term", description = "", simplified = term, traditional=""}}
local new = {}
local traditional, simplified
for _, v in ipairs(rec) do
-- this will be printed in the footnote
new[#new+1] = " [" .. v.spelling .. "] " .. v.description
-- save the simplified and traditional terms
traditional, simplified = v.traditional, v.simplified
end
-- you may want to add some separator betweend traditional and simplified terms
-- the multiple terms will be separated using semicolon
return traditional .. ": " .. simplified .. " " ..table.concat(new, "; ")
end
\end{luacode*}
\newcommand\loadccedict[1]{\directlua{load_ccedict("\detokenize{#1}")}}
\loadccedict{cedict_ts.u8}
\newcommand\chinese[1]{#1\footnote{\directlua{tex.sprint(ccedict_get_term("\detokenize{#1}"))}}}
\endinput
有两个 Lua 函数 -load_ccedict
加载字典并制作查询表,并ccedict_get_term
返回术语信息。该命令\chinese
使用此信息打印脚注。
它使用luatexja-fontspec
带有FandolSong
字体的软件包来获得对中文的开箱即用支持。您可能想使用其他字体,因为我发现它不支持所有繁体中文字符。
以下是一个示例文档:
\documentclass{article}
\usepackage{ccedict}
\begin{document}
Hello \chinese{炒面}, \chinese{得}
\end{document}
结果是:
(您可以在第一个脚注中看到缺失的字符。我对中文字体一无所知,所以我无法判断哪一个对繁体中文的支持更好)