標籤:

LaTeX定理環境如何使用俄文字母來編號?

比如: 第33個定理環境的編號是Я, 第34個定理環境的編號是АА.


按俄毛一貫傻大黑粗的思路,直接用 ifcase 弄個大轉換表就是了。像這樣:

% !TEX program = xelatex
% !TEX encoding = UTF-8
documentclass{article}
usepackage{fontspec}
setmainfont{CMU Serif}

defcyrnum#1{%
ifcase#1 0
or Аor Бor Вor Гor Дor Еor Ёor Жor Зor Иor Й%
or Кor Лor Мor Нor Оor Пor Рor Сor Тor Уor Ф%
or Хor Цor Чor Шor Щor Ъor Ыor Ьor Эor Юor Я%
or ААor АБor АВor АГor АДor АЕor АЁor АЖor АЗor АИor АЙ%
or АКor АЛor АМor АНor АОor АПor АРor АСor АТor АУor АФ%
or АХor АЦor АЧor АШor АЩor АЪor АЫor АЬor АЭor АЮor АЯ%
or БАor ББor БВor БГor БДor БЕor БЁor БЖor БЗor БИor БЙ%
or БКor БЛor БМor БНor БОor БПor БРor БСor БТor БУor БФ%
or БХor БЦor БЧor БШor БЩor БЪor БЫor БЬor БЭor БЮor БЯ%
or ВАor ВБor ВВor ВГor ВДor ВЕor ВЁor ВЖor ВЗor ВИor ВЙ%
or ВКor ВЛor ВМor ВНor ВОor ВПor ВРor ВСor ВТor ВУor ВФ%
or ВХor ВЦor ВЧor ВШor ВЩor ВЪor ВЫor ВЬor ВЭor ВЮor ВЯ%
else$infty$fi}

ewcommandcyrcnt[1]{cyrnum{value{#1}}}

ewtheorem{thm}{Theorem}

enewcommand hethm{cyrcnt{thm}}

egin{document}

egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
dots
setcounter{thm}{32}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}

end{document}

不想做大轉換表而要搞除法計算什麼的,參考這個帖子:LaTeX編程遇到的問題


比較好的是用 LaTeX3 中有現成的函數 int_to_symbols:nnn 來做這件事。

% !TEX program = xelatex
% !TEX encoding = UTF-8
documentclass{article}
usepackage{fontspec}
setmainfont{CMU Serif}

ExplSyntaxOn

DeclareExpandableDocumentCommand cyrnum { m }
{
int_to_symbols:nnn {#1} { 33 }
{
{ 1 } { А }
{ 2 } { Б }
{ 3 } { В }
{ 4 } { Г }
{ 5 } { Д }
{ 6 } { Е }
{ 7 } { Ё }
{ 8 } { Ж }
{ 9 } { З }
{ 10 } { И }
{ 11 } { Й }
{ 12 } { К }
{ 13 } { Л }
{ 14 } { М }
{ 15 } { Н }
{ 16 } { О }
{ 17 } { П }
{ 18 } { Р }
{ 19 } { С }
{ 20 } { Т }
{ 21 } { У }
{ 22 } { Ф }
{ 23 } { Х }
{ 24 } { Ц }
{ 25 } { Ч }
{ 26 } { Ш }
{ 27 } { Щ }
{ 28 } { Ъ }
{ 29 } { Ы }
{ 30 } { Ь }
{ 31 } { Э }
{ 32 } { Ю }
{ 33 } { Я }
}
}

ExplSyntaxOff

ewcommandcyrcnt[1]{cyrnum{value{#1}}}

ewtheorem{thm}{Theorem}

enewcommand hethm{cyrcnt{thm}}

egin{document}

egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
dots
setcounter{thm}{32}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}
egin{thm}end{thm}

end{document}

注意到這些俄文西里爾字母除了第七個字母 Ё(U+0401)外,其他字母的代碼點都是連續的,因此我們可以對 int_to_symbols:nnn 稍加改造,不用完整寫出字母表。

% !TEX program = xelatex
% !TEX encoding = UTF-8
documentclass{article}
usepackage{fontspec}
setmainfont{CMU Serif}

ExplSyntaxOn

cs_new:Npn int_to_symbols:nnN #1#2#3
{
int_compare:nNnTF {#1} &> {#2}
{
exp_args:NNNo exp_args:NNo exp_args:No \__int_to_symbols:nnnN
{ #3 { 1 + int_mod:nn { #1 - 1 } {#2} } } {#1} {#2} #3
}
{ #3 {#1} }
}
cs_new:Npn \__int_to_symbols:nnnN #1#2#3#4
{
exp_args:Nf int_to_symbols:nnN
{ int_div_truncate:nn { #2 - 1 } {#3} } {#3} #4
#1
}
cs_new:Npn
ussian_alphabet:n #1
{
char_generate:nn
{
int_compare:nNnTF {#1} &> c_seven
{ "40E + #1 }
{
int_compare:nNnTF {#1} &< c_seven { "40F + #1 } { "401 } } } { c_eleven } } DeclareExpandableDocumentCommand cyrnum { m } { int_to_symbols:nnN {#1} { 33 } ussian_alphabet:n } ExplSyntaxOff ewcommandcyrcnt[1]{cyrnum{value{#1}}} ewtheorem{thm}{Theorem} enewcommand hethm{cyrcnt{thm}} egin{document} egin{thm}end{thm} egin{thm}end{thm} egin{thm}end{thm} egin{thm}end{thm} dots setcounter{thm}{32} egin{thm}end{thm} egin{thm}end{thm} egin{thm}end{thm} egin{thm}end{thm} egin{thm}end{thm} end{document}


推薦閱讀:

寫論文用什麼軟體畫圖?
如何提高 LaTeX 的打字速度?
LaTeX ulem 下畫線斷線效果?
LuaTeX, XeTeX 和 ConTeXt 分別是什麼?它們有什麼異同優劣?
LaTeX 里如何定義 9 個參數以上的變數?

TAG:LaTeX |