CTeX-org / zhlipsum

Chinese dummy text
LaTeX Project Public License v1.3c
17 stars 4 forks source link

改进 GBK/Big5 编码的文本的定义方式 #1

Closed qinglee closed 6 years ago

qinglee commented 6 years ago

目前 GBK 和 Big5 编码的文件为了回避汉字第二个字节是 TeX 特殊字符 \/{/} 而采用 CJK 包的工具处理过,导致文件面目狰狞。我们可以不用 CJK 的工具,而是在定义这些文本的时候,临时改变 \/{/} 的类别码来回避这个问题。下面提供了一个初步的例子。

% !TEX encoding = Big5
% !TEX program  = pdfLaTeX

\RequirePackage{expl3}

\ExplSyntaxOn

\char_set_catcode_letter:N \@

\cs_new_protected:Npn \@@_new_text:n
  {
    \int_gincr:N \g_@@_text_int
    \group_begin:
      \@@_set_special_catcode:
      \char_set_catcode_group_begin:N \<
      \char_set_catcode_group_end:N   \>
      \tex_afterassignment:D \group_end:
      \tl_const:cn
        { c_@@_ \int_use:N \g_@@_text_int _tl }
  }
\int_new:N \g_@@_text_int
\cs_new_protected_nopar:Npn \@@_set_special_catcode:
  {
    \@@_active_first_byte:
    \char_set_catcode_other:N \\
    \char_set_catcode_other:N \{
    \char_set_catcode_other:N \}
  }
\cs_new_protected_nopar:Npx \@@_active_first_byte:
  {
    \int_step_function:nnnN
      { "81 } { 1 } { "FE } \char_set_catcode_active:n
  }

\@@_new_text:n
  <
    開稀飼
    認程臨
  >

\tl_show:c { c_@@_ \int_use:N \g_@@_text_int _tl }

\tex_end:D
stone-zeng commented 6 years ago

因为现在改用了 \clist_map_inline 来大量定义假文,仅仅修改 \__zhlipsum_new:nn 的类别码仍然不足以解决问题。如果连着外面的函数一起修改,又会比较麻烦,所以我的处理是在直接在假文文件中(也就是声明假文的时候)切换类别码。

目前看来使用上应该没有问题,但如果要定义新的假文片段,还需要由用户自行修改类别码,不是很方便(不过并不知道有什么非要用 GBK 和 Big5 的理由)。