% \iffalse meta-comment % !TEX program = XeLaTeX %<*internal> \iffalse %</internal> %<*readme> Boxed Chinese characters with Pinyin above and translation below based LaTeX3 ======= `hanzibox` is a LaTeX package developed in LaTeX3, which provides `\hanzibox`, `\hanzidialog` and `\writegrid` macros. These macros are used for typesetting Chinese character with or without a background grid such as a cross grid or star grid for Chinese character writting learning. And you can display the Hanyu Pinyin above the Chinese character and the translation below them as needed. The `\hanzibox` macro can automatically invoke the `\xpinyin*` macro of the `xpinyin` package to get Hanyu Pinyin according to the Chinese characters. And the `\hanzibox` macro provides an asterisk version of `\hanzibox*`, whose function is achieved by automatically invoking the `xpinyin` package's `\pinyin` macro to get Hanyu Pinyin. The `\hanzidialog` macro is implemented by manually inserting the `\pinyin` macro of the `xpinyin` package in it's pinyin option. The `\writegrid` macro is for write a composition anwser grid. `hanzibox` is a utility for learning to write and pronounce Chinese characters, and can be used for Chinese character learning plans, presentations, exercise booklets and other documentation work. The development of this package was inspired by [Jan Vorisek's hanzibox package](https://github.com/janvorisek/chinese-latex-utilities). However, the new package redesigned the `\hanzibox` and `\hanzidialog` macros and the background grid is redesigned with the `l3draw` package by reference to [zitie package](https://www.ctan.org/pkg/zitie). Also, the new package provides more options and arguments in order to get better results. The `hanzibox.sty` package currently only supports the XeTeX engine and only supports UTF-8 encoded LaTeX source files. You can read the manual (in Chinese) for more details and examples. Contributing ------------ 1. github repository: 1. repository: [hanzibox-l3](https://github.com/registor/hanzibox-l3) 2. Issues and pull requests are welcome. [issue](https://github.com/registor/hanzibox-l3/issues) or [pull request](https://github.com/registor/hanzibox-l3/pulls). 2. gitee repository: 1. repository: [hanzibox-l3](https://gitee.com/nwafu_nan/hanzibox-l3) 2. Issues and pull requests are welcome. [issue](https://gitee.com/nwafu_nan/hanzibox-l3/issues) or [pull request](https://gitee.com/nwafu_nan/hanzibox-l3/pulls). 基于LaTeX3的带注音和译文的汉å—ç»ƒä¹ å®åŒ… ======= `hanzibox`是一个用LaTeX3å¼€å‘çš„LaTeXå®åŒ…,它æä¾›äº†`\hanzibox`ã€`\hanzidialog` å’Œ`\writegrid`三个个命令。这三个命令分别用于排版汉å—å¦ä¹ ä¸å¸¦æœ‰æˆ–ä¸å¸¦ç”°å—æ ¼ã€ç±³å—æ ¼ç‰èƒŒæ™¯æ ¼å的汉å—,并å¯ä»¥æ ¹æ®éœ€è¦åœ¨æ±‰å—æ£ä¸Šæ–¹æ˜¾ç¤ºæ‹¼éŸ³ï¼Œåœ¨æ£ä¸‹æ–¹æ˜¾ç¤ºè¯‘文。其ä¸ï¼Œ`\hanzibox`å‘½ä»¤èƒ½å¤Ÿæ ¹æ®æ±‰å—自动调用`xpinyin`å®åŒ…çš„`\xpinyin*`å‘½ä»¤å®žçŽ°æ±‰å—æ³¨éŸ³ã€‚并且`\hanzibox`命令æä¾›äº†`\hanzibox*`星å·ç‰ˆæœ¬ï¼Œå…¶æ³¨éŸ³åŠŸèƒ½æ˜¯é€šè¿‡è‡ªåŠ¨è°ƒç”¨`xpinyin`å®åŒ…çš„`\pinyin`命令实现的。`\hanzidialog`å‘½ä»¤çš„æ³¨éŸ³åŠŸèƒ½æ˜¯é€šè¿‡åœ¨æ‹¼éŸ³é€‰é¡¹ä¸æ‰‹åЍæ’å…¥`xpinyin`å®åŒ…`\pinyin`命令实现的。`\writegrid`命令用于排版作文题目的ç”é¢˜æ ¼å纸。 `hanzibox` 是一个用于å¦ä¹ 汉å—书写与å‘音的工具,å¯ä»¥ç”¨äºŽæ±‰å—å¦ä¹ æ•™æ¡ˆã€æ¼”示文稿ã€ä¹ é¢˜å†Œç‰æ–‡æ¡£å·¥ä½œã€‚ 该å®åŒ…的开å‘çµæ„Ÿæºè‡ª[Jan Vorisekçš„hanziboxå®åŒ…](https://github.com/janvorisek/chinese-latex-utilities)。但对`\hanzibox`å’Œ`\hanzidialog`命令釿–°è¿›è¡Œäº†è®¾è®¡ï¼Œå¹¶å‚考[zitieå—è´´å®åŒ…](https://www.ctan.org/pkg/zitie)釿–°ç”¨`l3draw`å®åŒ…è®¾è®¡äº†èƒŒæ™¯æ ¼åã€‚åŒæ—¶ï¼Œæ–°çš„å®åŒ…也æä¾›äº†æ›´å¤šå‘½ä»¤é€‰é¡¹å’Œå‚数,以期更好地控制排版结果。 ç›®å‰ï¼Œ`hanzibox.sty`å®åŒ…仅支æŒXeTeXç¼–è¯‘å¼•æ“Žï¼Œå¹¶ä¸”åªæ”¯æŒUTF-8ç¼–ç çš„LaTeXæºæ–‡ä»¶ã€‚ å¯ä»¥é€šè¿‡é˜…读å®åŒ…手册(䏿–‡)以也解该å®åŒ…æ›´å¤šçš„ä½¿ç”¨ç»†èŠ‚å’Œä½¿ç”¨æ ·ä¾‹ã€‚ ### å‚与贡献 --------------------- 1. github仓库: (1). 仓库地å€: [hanzibox-l3](https://github.com/registor/hanzibox-l3) (2). Issueså’ŒPR: [issue](https://github.com/registor/hanzibox-l3/issues) or [pull request](https://github.com/registor/hanzibox-l3/pulls). 2. gitee仓库: (1). 仓库地å€: [hanzibox-l3](https://gitee.com/nwafu_nan/hanzibox-l3) (2). Issues and PR: [issue](https://gitee.com/nwafu_nan/hanzibox-l3/issues) or [pull request](https://gitee.com/nwafu_nan/hanzibox-l3/pulls). Copyright and Licence --------------------- Copyright (C) 2020-2022 by Nan Geng <nangeng@nwafu.edu.cn> ---------------------------------------------------------------------- This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this license or (at your option) any later version. This version of this license is in http://www.latex-project.org/lppl/lppl-1-3c.txt and the latest version of this license is in http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all distributions of LaTeX version 2005/12/01 or later. This work has the LPPL maintenance status "maintained". The Current Maintainer of this work is Nan Geng. This package consists of the file hanzibox.dtx, and the derived files hanzibox.sty, hanzibox.pdf, hanzibox.ins, README.md (this file). %</readme> %<*internal> \fi \begingroup \def\temp{LaTeX2e} \expandafter\endgroup\ifx\temp\fmtname\else \csname fi\endcsname %</internal> %<*install> \input ctxdocstrip % \let\MetaPrefix\relax \preamble Copyright (C) 2020-2022 by Nan Geng <nangeng@nwafu.edu.cn> -------------------------------------------------------------------------- This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this license or (at your option) any later version. This version of this license is in http://www.latex-project.org/lppl/lppl-1-3c.txt and the latest version of this license is in http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all distributions of LaTeX version 2005/12/01 or later. This work has the LPPL maintenance status "maintained". The Current Maintainer of this work is Nan Geng. -------------------------------------------------------------------------- \endpreamble \postamble This package consists of the file hanzibox.dtx, and the derived files hanzibox.sty, hanzibox.pdf, hanzibox.ins, README.md. \endpostamble \declarepostamble\emptypostamble \endpostamble \def\MetaPrefix{-- } \let\MetaPrefix\DoubleperCent \generate { %</install> %<*internal> \usedir{source/xelatex/hanzibox} \file{hanzibox.ins} {\from{\jobname.dtx}{install}} %</internal> %<*install> \usedir{xetex/xelatex/hanzibox} \file{hanzibox.sty} {\from{\jobname.dtx}{package}} \nopreamble\nopostamble \usedir{doc/xelatex/hanzibox} \file{README.md} {\from{\jobname.dtx}{readme}} } \endbatchfile %</install> %<*internal> \fi %</internal> %<package>\NeedsTeXFormat{LaTeX2e}[2020/10/01] %<package>\RequirePackage{expl3} %<+package>\GetIdInfo$Id: hanzibox.dtx 2.3.0 2022-04-17 08:00:00 +0800 Nan Geng <nangeng@nwafu.edu.cn> $ %<package> {Boxed Chinese characters with Pinyin above and translation below.} %<package>\ProvidesExplPackage{\ExplFileName} %<package> {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} %<*driver> \documentclass{ctxdoc} \usepackage{listings} \usepackage{xcolor} \usepackage{xcolor-material} \usepackage{hanzibox} \renewcommand*\marg[1]{\{\meta{#1}\}} \renewcommand*\oarg[1]{[\meta{#1}]} \renewcommand*\parg[1]{(\meta{#1})} \NewDocumentCommand{\init}{+v}{\hspace{\fill}åˆå§‹å€¼~=~\textcolor{blue}{\bfseries#1}} \DeclareDocumentCommand\opt{m}{\texttt{#1}} \DeclareDocumentCommand\kvopt{mm} {\texttt{#1\breakablethinspace=\breakablethinspace#2}} \def\breakablethinspace{\hskip 0.16667em\relax} \begin{document} %<!--CODEDOC--> \DisableImplementation \EnableImplementation \DocInput{\jobname.dtx} \IndexLayout \PrintChanges \PrintIndex \end{document} %</driver> % \fi % % \changes{v1.0.0}{2021/09/18}{开始编写模æ¿} % \changes{v2.0.0}{2021/09/25}{基于l3draw釿–°è®¾è®¡} % \changes{v2.0.0}{2021/09/28}{釿–°ç¼–写README.md内容} % % \CheckSum{0} % \GetFileId{hanzibox.sty} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % \title{\bfseries\pkg{hanzibox}ï¼šç”°å—æ ¼-ç±³å—æ ¼æ±‰å—ç»ƒä¹ å®åŒ…} % \author{è€¿æ¥ \\ \path{nangeng@nwafu.edu.cn}} % \date{\filedate\qquad\fileversion\thanks{\url{https://github.com/registor/hanzibox-l3}}\thanks{\url{https://gitee.com/nwafu_nan/hanzibox-l3}}} % \maketitle % % \changes{v2.0.0}{2021/09/28}{修订说明文档} % \changes{v2.1.2}{2021/10/07}{ä¸ºè¯´æ˜Žæ–‡æ¡£æ·»åŠ ç›®å½•} % % \begin{documentation} % % \begin{abstract} % % \pkg{hanzibox} 是一个用\LaTeX3å¼€å‘çš„ \LaTeX å®åŒ…,它æä¾› % 了\tn{hanzibox}ã€\tn{hanzidialog}å’Œ\tn{writegrid}三 % 个命令。这三个命令用于输出汉å—å¦ä¹ ä¸å¸¦æœ‰æˆ–ä¸å¸¦ç”°å—æ ¼ã€ç±³å—æ ¼ç‰èƒŒæ™¯æ ¼å的汉å—, % å¹¶å¯ä»¥æ ¹æ®éœ€è¦åœ¨æ±‰å—æ£ä¸Šæ–¹æ˜¾ç¤ºæ‹¼éŸ³ï¼Œåœ¨æ£ä¸‹æ–¹æ˜¾ç¤ºè¯‘文。 % å…¶ä¸ï¼Œ\tn{hanzibox}å‘½ä»¤èƒ½å¤Ÿæ ¹æ®æ±‰å—利用\pkg{xpinyin}å®åŒ…è‡ªåŠ¨å®žçŽ°æ±‰å—æ³¨éŸ³ã€‚ % åŒæ—¶ï¼Œ\tn{hanzibox}命令还æä¾›äº†\tn{hanzibox*}星å·ç‰ˆæœ¬ï¼Œä»¥å®žçŽ°æ±‰å—的手动注音功能。 % \tn{hanzidialog}å‘½ä»¤çš„æ³¨éŸ³åŠŸèƒ½åˆ™æ˜¯é€šè¿‡åœ¨å…¶æ‹¼éŸ³é€‰é¡¹ä¸æ‰‹åЍæ’å…¥ % \pkg{xpinyin}å®åŒ…çš„\tn{pinyin}命令实现。\tn{writegrid}命令用于排版 % 作文题目的ç”é¢˜æ ¼å纸。 % % \end{abstract} % % \tableofcontents % % \section{简è¦è¯´æ˜Ž} % % \pkg{hanzibox} 是一个用于输出汉å—å¦ä¹ ä¸çš„ç”°å—æ ¼ã€ç±³å—æ ¼ç‰èƒŒæ™¯ï¼Œå¹¶åœ¨æ±‰å—æ£ä¸Šæ–¹æ˜¾ç¤ºæ‹¼éŸ³ï¼Œ % 在æ£ä¸‹æ–¹æ˜¾ç¤ºè¯‘文。当然,也å¯ä»¥æ ¹æ®éœ€è¦éšè—æ‹¼éŸ³ã€æ±‰å—或译文,还å¯ä»¥é€‰æ‹©æ€§åœ°éšè—拼音ä¸çš„ % 声æ¯ã€éŸµæ¯æˆ–音调,从而有效实现汉å—å¦ä¹ ä¸çš„ç´ æå‡†å¤‡ã€‚ % % 使用\pkg{hanzibox}å®åŒ…çš„\LaTeX æºæ–‡ä»¶éœ€é‡‡ç”¨ \texttt{UTF-8}ç¼–ç ,并且需使用\XeLaTeX 进行编译。 % % \pkg{hanzibox} ä¾èµ– \package{l3kernel} ã€\package{l3packages}ã€\package{l3draw}å’Œ\package{xpinyin}å®åŒ…。 % % \section{用户接å£} % % \subsection{\tn{hanzibox}命令} % % \begin{function}[added=2021-09-18,updated=2021-10-07]{\hanzibox,\hanzibox*} % \begin{syntax} % \tn{hanzibox} \oarg{外观选项} \Arg{汉å—} \oarg{拼音选项} \oarg{译文选项} % \tn{hanzibox*} \oarg{外观选项} \Arg{汉å—} \oarg{拼音选项} \oarg{译文选项} % \end{syntax} % 排版汉å—ï¼Œå¹¶æ ¹æ®é€‰é¡¹å†…容在顶部排版拼音,在底部排版译文。\\ % å…¶ä¸ï¼Œ\Arg{汉å—}å¯ä»¥ç•™ç©ºï¼Œ\oarg{外观选项}用于设置盒å外观; % \tn{hanzibox}命令ä¸çš„\oarg{拼音选项}æ— æ•ˆï¼Œå¯ä»¥çœç•¥ï¼Œä¹Ÿå¯ä»¥ç•™ç©ºï¼› % \oarg{译文选项}å¯ä»¥æ˜¯ä»»æ„æ–‡æœ¬ï¼Œéœ€è¦æ³¨æ„的是,当需è¦\oarg{译文选项}时, % \oarg{拼音选项}å¯ä»¥ç•™ç©ºï¼Œä½†ä¸èƒ½çœç•¥ã€‚ % 注音由\pkg{xpinyin}å®åŒ…è‡ªåŠ¨æ ¹æ®æ±‰å—èŽ·å¾—ï¼Œæ¤æ—¶ï¼Œå¯èƒ½ä¼šå˜åœ¨å¤šéŸ³å—ç‰é—®é¢˜ï¼Œ % 其调整详情请å‚阅\pkg{xpinyin}å®åŒ…说明。星å·å‘½ä»¤\tn{hanzibox*}ç”¨äºŽæ‰‹åŠ¨æ·»åŠ æ³¨éŸ³ã€‚ % % æŽ’ç‰ˆæ ·å¼å¯é€šè¿‡\tn{hanziboxset}命令或\tn{hanzibox}\oarg{外观选项}çš„key-value进行设置。 % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.35\linewidth,gobble=5] % \centering % \hanziboxset{fillcolor=yellow!30, charcolor=red, % xscale=1.5,yscale=1.5,resize=real,framecolor=red} % \hanzibox[frametype=none]{我}\\[1ex] % \hanzibox[frametype=å ]{我}[wo3][俺] % \hanzibox[frametype=× ]{我}[wo2][爷] % \hanzibox[frametype=ç±³ ]{我}[ni3][奴]\\[1ex] % \hanzibox[frametype=å£,pinyinline=true]{我}[][å¾] % \hanzibox[frametype=ç”°,pinyinline=true]{我}[wo1][愚] % \hanzibox[frametype=å’ª,pinyinline=true]{我}[ta1][山人] % \end{SideBySideExample} % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.35\linewidth,gobble=5] % \centering % \hanziboxset{xscale=1.5,yscale=1.5,resize=real} % \hanzibox*[frametype=none]{我}[wo3][me]\\[1ex] % \hanzibox*[frametype=å ]{我}[wo3][俺] % \hanzibox*[frametype=× ]{我}[wo3][爷] % \hanzibox*[frametype=ç±³ ]{我}[ni3][奴]\\[1ex] % \hanzibox*[frametype=å£,pinyinline=true]{我}[wo3][å¾] % \hanzibox*[frametype=ç”°,pinyinline=true]{我}[wo2][愚] % \hanzibox*[frametype=å’ª,pinyinline=true]{我}[ta5][山人] % \end{SideBySideExample} % \end{function} % % \subsection{\tn{hanzidialog}命令} % % \begin{function}[added=2021-09-18,updated=2021-10-07]{\hanzidialog} % \begin{syntax} % \tn{hanzidialog} \oarg{外观选项} \Arg{汉å—} \oarg{拼音选项} \oarg{译文选项} % \end{syntax} % 排版汉å—ï¼Œå¹¶æ ¹æ®é€‰é¡¹å†…容在顶部排版拼音,在底部排版译文。\\ % å…¶ä¸ï¼Œ\Arg{汉å—}å¯ä»¥ç•™ç©ºï¼Œ\oarg{拼音选项}å¯ä»¥æ˜¯ä»»æ„文本;\oarg{译文选项}å¯ä»¥æ˜¯ä»»æ„文本。 % \oarg{拼音选项}å’Œ\oarg{译文选项}都å¯ä»¥ç•™ç©ºï¼Œä¹Ÿå¯ä»¥çœç•¥ï¼Œ % 但当需è¦\oarg{译文选项}时,\oarg{拼音选项}å¯ä»¥ç•™ç©ºï¼Œä½†ä¸èƒ½çœç•¥ã€‚ % å¦‚æžœæ˜¯æ±‰è¯æ‹¼éŸ³åˆ™éœ€è¦æ‰‹åŠ¨ä½¿ç”¨\pkg{xpinyin}å®åŒ…çš„\tn{pinyin}å‘½ä»¤æ·»åŠ æ³¨éŸ³ï¼Œ % æŽ’ç‰ˆæ ·å¼å¯é€šè¿‡\tn{hanziboxset}命令或\tn{hanzidialog}\oarg{外观选项}设置。 % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.25\linewidth,gobble=5] % \centering % \hanzidialog{王è€å¸ˆ}[Wang \pinyin{lao3shi1}][teacher wang] % % \hanzidialog[frametype=ç”°]{王è€å¸ˆ}[Wang \pinyin{lao3shi1}] % [王先生] % % \hanzidialog[frametype=å’ª,framecolor=red,pinyinline=true, % height=1cm,resize=real,pinyincolor=blue] % {王è€å¸ˆ}[Wang \pinyin{lao3shi1}][王先生] % \end{SideBySideExample} % \end{function} % % \subsection{\tn{writegrid}命令} % % \begin{function}[added=2022-04-17,updated=2022-04-17]{\writegrid} % \begin{syntax} % \tn{writegrid} \oarg{外观选项} \Arg{行数} % \end{syntax} % æ ¹æ®æŒ‡å®šçš„\Arg{行数},用\oarg{外观选项}æŒ‡å®šçš„å¤–è§‚å‚æ•°å’Œè¡Œé—´è·åŠ % 列数排版作文题目ä¸çš„å†™ä½œæ ¼å纸。\\ % å…¶ä¸ï¼Œ\oarg{外观选项}用于å•ä¸ªæ ¼åç›’åå¤–è§‚ï¼Œä½†è¦æ³¨æ„æ¤æ—¶ï¼Œ % \oarg{拼音选项}ã€\oarg{译文选项}åŠå…¶ç›¸å…³é€‰é¡¹æ— 效。与作文 % 直接相关的选项有\oarg{gridsepv}用于设置ä¸åŒæ ¼å行的间è·ï¼Œ % \oarg{gridcols}用于设置æ¯è¡Œçš„æ ¼åæ•° % % æŽ’ç‰ˆæ ·å¼å¯é€šè¿‡\tn{hanziboxset}命令或\tn{writegrid}\oarg{外观选项}çš„key-value进行设置。 % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.65\linewidth,gobble=5] % \centering % \hanziboxset{framecolor=red, % fillcolor=yellow!30} % \writegrid{5} % \end{SideBySideExample} % \end{function} % % \subsection{\tn{hanziboxset}命令} % % \begin{function}[added=2021-09-20,updated=2021-09-24]{\hanziboxset} % \begin{syntax} % \tn{hanziboxset} \marg{键值列表} % \end{syntax} % \tn{hanziboxset} çš„å‚æ•°æ˜¯ä¸€ç»„ç”±(英文)逗å·éš”开的选项列表, % 列表ä¸çš„选项通常是 \kvopt{\meta{key}}{\meta{value}} å½¢å¼ã€‚ % 部分选项的\meta{value} å¯ä»¥çœç•¥ã€‚对于åŒä¸€é€‰é¡¹ï¼ŒåŽç»è®¾ç½®ä¼šè¦†ç›–以å‰çš„设置。 % 多数选项都设有默认值。 % % \tn{hanziboxset} 采用 \LaTeX3 é£Žæ ¼çš„é”®å€¼è®¾ç½®ï¼Œæ”¯æŒä¸åŒç±»åž‹ä»¥åŠå¤šç§ % 层次的选项设定。键值列表ä¸ï¼Œâ€œ|=|â€å·¦å³çš„ç©ºæ ¼ä¸å½±å“设置;但需注æ„, % 傿•°åˆ—表ä¸\textbf{ä¸å¯ä»¥å‡ºçŽ°ç©ºè¡Œ}。 % % å¸ƒå°”åž‹çš„å‚æ•° \kvopt{\meta{选项}}{true} ä¸çš„“|= true|â€å¯ä»¥çœç•¥ã€‚ % \end{function} % % \section{选项说明} % % 本å®åŒ…æä¾›äº†ä¸€ç³»åˆ—选项,以实现汉å—ç›’åå¤–è§‚æ ·å¼è®¾ç½®ã€‚ % 载入\pkg{hanzibox}å®åŒ…åŽï¼Œä»¥ä¸‹é€‰é¡¹å‡å¯é€šè¿‡ç”¨æˆ·æŽ¥å£å‘½ä»¤\tn{hanziboxset}进行设置。 % åŒæ—¶ï¼Œè¿™äº›é€‰é¡¹ä¹Ÿå¯ä»¥é€šè¿‡\tn{hanzibox}或\tn{hanzidialog}命令的\oarg{外观选项}进行设置。 % % \subsection{基础å—符和å—å·} % % \begin{function}[added=2021-09-24,updated=2021-09-24]{basechar,zihao} % \begin{syntax} % basechar = \meta{CJK char} \init{好} % zihao = \meta{å—å·} \init{4} % \end{syntax} % \opt{basechar} 设置基å—符,用于计算缩放比例åŠç•™ç©ºæ±‰å—å ä½å¤„ç†ï¼Œ % 基å—符ä¸åŒæ—¶ï¼Œå³ä½¿ç»™å®šç›¸åŒçš„缩放比例,其实际缩放比例也å¯èƒ½ä¸åŒã€‚ % % \opt{zihao} 设置基å—符的å—å·ã€‚ % \end{function} % % \subsection{æ‹¼éŸ³ã€æ±‰å—å’Œè¯‘æ–‡æ ¼å¼} % % \begin{function}[added=2021-09-27,updated=2021-10-08]{pinyinf,charf,tranf} % \begin{syntax} % pinyinf = \meta{æ ¼å¼å‘½ä»¤} \init{\normalsize} % charf = \meta{æ ¼å¼å‘½ä»¤} \init{\tiny} % tranf = \meta{æ ¼å¼å‘½ä»¤} \init{\tiny} % \end{syntax} % åˆ†åˆ«ç”¨äºŽè®¾ç½®æ‹¼éŸ³ã€æ±‰å—ã€è¯‘æ–‡çš„æŽ’ç‰ˆæ ¼å¼ï¼Œä¸»è¦ç”¨äºŽè®¾ç½®å—体ã€å—å·ã€ç²—ç»†ç‰æ ¼å¼ã€‚ % % 为了分解拼音,本å®åŒ…截获了原\pkg{xpinyin}å®åŒ…ä¸çš„æ‹¼éŸ³è¾“å‡ºï¼Œå› æ¤è‹¥éœ€è¦ä¿®æ”¹æ‹¼éŸ³å—体, % 请在\verb!pinyinf!选项ä¸è¿›è¡Œè®¾ç½®ã€‚ % % \textcolor[HTML]{AD1457}{强烈建议将å•个汉å—宽度设置为大于其拼音或译文总宽度, % 以å…在汉å—é—´å½¢æˆç¼éš™}。 % \end{function} % % \subsection{外框类型和缩放方å¼} % % \begin{function}[added=2021-09-24,updated=2021-10-08]{frametype,resize} % \begin{syntax} % frametype = <none|å|×|ç±³|å£|ç”°|å’ª> \init{none} % resize = <none|real|base> \init{none} % \end{syntax} % \opt{frametype} 设置汉å—ç›’åæ ·å¼ã€‚å¯ç”¨å€¼çš„æ•ˆæžœä¸Žé€‰é¡¹å€¼æ–‡å—形状类似: % \verb|å|--ä»…ä¸é—´çš„æ¨ªçº¿å’Œç«–线,\verb|×|--ä»…ä¸é—´çš„两æ¡å¯¹è§’线, % \verb|ç±³|--åå—æ ¼å†åŠ ä¸Šæ–œçš„ä¸¤æ¡å¯¹è§’线, % \verb|å£|--仅方框,\verb|ç”°|--常è§çš„ç”°å—æ ¼ï¼Œ\verb|å’ª|--常è§çš„ç±³å—æ ¼ã€‚ % \end{function} % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.50\linewidth,gobble=5] % \centering % \hanzibox[frametype=none]{æ— }\\[1ex] % \hanzibox[frametype=å ]{å} % \hanzibox[frametype=× ]{义} % \hanzibox[frametype=ç±³ ]{ç±³}\\[1ex] % \hanzibox[frametype=å£ ]{å£} % \hanzibox[frametype=ç”° ]{ç”°} % \hanzibox[frametype=å’ª ]{å’ª} % \end{SideBySideExample} % % \opt{resize} 设置缩放方å¼ï¼Œ\opt{real}--使用å—符实际宽高缩放, % \opt{base}--使用 \opt{basechar} å—符的宽高缩放, % % 以下为宽度设置为 1cm 时的缩放情况。 % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.45\linewidth,gobble=5] % \centering % \hanziboxset{width=1cm,frametype=å’ª, % framecolor=black} % \hanzibox[resize=none ]{æ— } % \hanzibox[resize=real ]{实} % \hanzibox[resize=base ]{基} % \end{SideBySideExample} % % \subsection{缩放比例åŠå°ºå¯¸} % % \begin{function}[added=2021-09-24,updated=2021-09-24]{ % xscale,yscale,scale, % width,height} % \begin{syntax} % xscale = \meta{scale ratio} \init{1} % yscale = \meta{scale ratio} \init{1} % scale = \meta{scale ratio} % width = \meta{dim} % height = \meta{dim} % \end{syntax} % 设置缩放比例和盒å宽高。 % % 宽高具有更高的优先级,å³è‹¥æ¯”例和宽高都设置了,则使用宽高æ¥è®¡ç®—。 % 宽高都为0cm视为未设置,二者有一大于0cm,视为设置了宽高。 % \end{function} % % \subsection{ç›’åæ ·å¼} % % \begin{function}[added=2021-09-24,updated=2021-09-24]{ % linewidth, % dashpattern, % framearc, % framearc*, % framelinewidth, % pinyinlinewidth, % crosslinewidth % } % \begin{syntax} % linewidth = \meta{dim} \init{0.4pt} % dashpattern = \meta{ dim1, dim2, ... } % framearc = \meta{dim} % framearc* = \{ \marg{dim1} \marg{dim2} \} % framelinewidth = \meta{dim} \init{0.4pt} % pinyinlinewidth = \meta{dim} \init{0.4pt} % crosslinewidth = \meta{dim} \init{0.4pt} % \end{syntax} % 设置边框线宽ã€çº¿åž‹ã€è½¬è§’æ ·å¼åŠæ‹¼éŸ³å››çº¿æ ¼å’Œå†…æ ¼çº¿çº¿å®½ã€‚ % % \textcolor[HTML]{AD1457}{注:目å‰\textbf{linewidth}与 % \textbf{framelinewidth}选项的作用相åŒï¼Œéƒ½æ˜¯è®¾ç½®è¾¹æ¡†çº¿å®½ï¼Œ % 在下一个版本ä¸ï¼Œä¼šåˆ 除\textbf{linewidth}选项}。 % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.28\linewidth,gobble=5] % \centering % \hanziboxset{width=1.0cm,resize=real,framecolor=red} % \hanzibox[linewidth=1pt,frametype=å£]{好} % \hanzibox[dashpattern={1.5mm,1mm,2mm,1.5mm},frametype=ç”°]{好} % \hanzibox[framelinewidth=1pt,frametype=å’ª]{好} \\ % \hanzibox[pinyinline,framearc=1mm,frametype=å£]{好} % \hanzibox[framearc*={1mm}{2mm},frametype=ç”°]{好} % \hanzibox[framearc*={2mm}{1mm},frametype=å’ª]{好}\\ % \hanzibox[pinyinline,pinyinlinewidth=0.8pt,frametype=å£]{好} % \hanzibox[crosslinewidth=1pt,frametype=ç”°]{好} % \hanzibox[crosslinewidth=1pt,frametype=å’ª]{好} % \end{SideBySideExample} % \end{function} % % \subsection{颜色设置} % % % \begin{function}[added=2021-10-07,updated=2021-10-07]{crosscolorratio} % \begin{syntax} % crosscolorratio = \meta{integer} \init{20} % \end{syntax} % æ ¼å内部åå—线或米å—线颜色å 边框颜色的比例(0$\sim$100\%)。 % % \textcolor[HTML]{AD1457}{注:\textbf{crosscolorratio}选项须在设置了\textbf{framecolor}é€‰é¡¹åŽæ‰èƒ½ç”Ÿæ•ˆ}。 % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.25\linewidth,gobble=5] % \centering % \hanzibox[frametype=å’ª,framecolor=red]{å} % \hanzibox[frametype=å’ª,crosscolorratio=30,framecolor=red]{ç”°} % \hanzibox[frametype=å’ª,crosscolorratio=50,framecolor=red]{ç±³} % \hanzibox[frametype=å’ª,crosscolorratio=80,framecolor=red]{å’ª} % \end{SideBySideExample} % \end{function} % % \begin{function}[added=2021-09-24,updated=2021-10-07]{ % framecolor, % framecolor*, % charcolor, % charcolor*, % pinyincolor, % pinyincolor*, % trancolor, % trancolor*, % fillcolor, % fillcolor* % } % \begin{syntax} % framecolor = \meta{color expr} \init{black} % framecolor* = \meta{model(s)} \meta{value(s)} % charcolor = \meta{color expr} \init{black} % charcolor* = \meta{model(s)} \meta{value(s)} % pinyincolor = \meta{color expr} \init{black} % pinyincolor* = \meta{model(s)} \meta{value(s)} % trancolor = \meta{color expr} \init{black} % trancolor* = \meta{model(s)} \meta{value(s)} % fillcolor = \meta{color expr} % fillcolor* = \meta{model(s)} \meta{value(s)} % \end{syntax} % åˆ†åˆ«è®¾ç½®æ ¼å外框ã€å—ç¬¦ã€æ‹¼éŸ³ã€è¯‘文和填充颜色。 % 颜色åç§°ä»…æ”¯æŒ \LaTeX3 定义的 black, white, red, green, blue, cyan, magenta å’Œ yellow。 % 颜色模型和表达å¼ä¹Ÿåº”使用 \LaTeX3 支æŒçš„æ¨¡åž‹å’Œè¡¨è¾¾å¼ï¼Œè¯¦è§ \pkg{interface3.pdf} 文档。 % % è‹¥è¦åŽ»æŽ‰ \opt{fillcolor},应将其置为空(\verb|fillcolor={}|)ï¼Œè€Œä¸æ˜¯å°†å…¶è®¾ç½®ä¸ºwhite(白色)。 % \end{function} % % \subsection{å—符轮廓类型} % % \begin{function}[added=2021-10-08,updated=2021-10-08]{charstroke} % \begin{syntax} % charstroke = <none|solid|dashed|invisible> \init{none} % \end{syntax} % 设置å—ç¬¦å¤–è½®å»“æ ·å¼ã€‚ % % åˆå§‹å€¼ \opt{none} æŒ‰åŽŸæ ·è¾“å‡ºã€‚\opt{solid} 设置外轮廓为 0.10bp 的实线, % \opt{dashed} 设置外轮廓为 0.10bp çš„è™šçº¿ã€‚åŒæ—¶ï¼Œä¸å¡«å……轮廓内部,显示为背景颜色。 % \opt{invisible} å°†å—符设置为ä¸å¯è§ï¼Œä½†ä¸å½±å“èƒŒæ™¯å’Œç½‘æ ¼çš„æ˜¾ç¤ºï¼Œéšè—çš„å—ä»ç„¶å¯è¢«å¤åˆ¶ã€‚ % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.30\linewidth,gobble=5] % \centering % \hanziboxset{width=1.0cm,resize=real,frametype=å’ª, % framecolor=red} % \hanzibox[charstroke=none ]{我} % \hanzibox[charstroke=solid,charcolor=red ]{我}\\ % \hanzibox[charstroke=dashed,charcolor=green!40!black]{我} % \hanzibox[charstroke=invisible ]{我} % \end{SideBySideExample} % \end{function} % % \subsection{声æ¯ã€éŸµæ¯å’Œå£°è°ƒå¼€å…³} % % \begin{function}[added=2021-09-24,updated=2021-09-24]{initial,vowel,tone} % \begin{syntax} % initial = <\TTF> \init{true} % vowel = <\TTF> \init{true} % tone = <\TTF> \init{true} % \end{syntax} % 分别用于设置是å¦è¾“出拼音的声æ¯ã€éŸµæ¯å’Œå£°è°ƒï¼Œé»˜è®¤å€¼ä¸º\textbf{true}。 % % 该选项对\tn{hanzidialog}å‘½ä»¤æ— æ•ˆã€‚ % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.28\linewidth,gobble=5] % % \centering % \hanziboxset{frametype=å’ª,framecolor=red, % fillcolor=yellow!40,resize=real} % \hanzibox{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \hanzibox[initial=false]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \hanzibox[vowel=false]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \hanzibox[tone=false]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \hanzibox[initial=false,vowel=false]{æ˜Žæœ‰å‡ æ—¶æœ‰} % [][How long will the full moon appear?] % % \end{SideBySideExample} % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.28\linewidth,gobble=5] % \centering % \hanziboxset{frametype=å’ª,framecolor=red,fillcolor=yellow!40, % charf=\Huge,pinyinf=\small,tranf=\small,resize=real} % \hanzibox*[tone=false]{我}[wo3][å¾] % \hanzibox*[vowel=false]{我}[wo3][å¾] % \hanzibox*[initial=false]{我}[wo3][䏿‰] % \end{SideBySideExample} % \end{function} % % \subsection{æ‹¼éŸ³å››çº¿æ ¼å¼€å…³} % % \begin{function}[added=2021-10-07,updated=2021-10-08]{pinyinline} % \begin{syntax} % pinyinline = <\TFF> \init{false} % \end{syntax} % 用于设置是å¦è¾“å‡ºæ‹¼éŸ³å››çº¿æ ¼ï¼Œé»˜è®¤å€¼ä¸º\textbf{false}。 % ä¸ºä¿æŒæ‹¼éŸ³å¯¹é½ä¸€è‡´æ€§ï¼Œ\verb!pinyinline=false!时, % ä»…ä¸è¾“å‡ºæ‹¼éŸ³å››çº¿æ ¼ï¼Œä½†æ‹¼éŸ³å››çº¿æ ¼çš„ç©ºé—´å ä½ä»ç„¶å˜åœ¨ã€‚ % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.33\linewidth,gobble=5] % \centering % \hanziboxset{frametype=å’ª,framecolor=red,charf=\large, % fillcolor=yellow!40} % \hanzibox[pinyinline=false]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \hanzibox[pinyinline=true]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % \end{SideBySideExample} % \end{function} % % \subsection{æ‹¼éŸ³ã€æ±‰å—和译文开关} % % \begin{function}[added=2021-09-21,updated=2021-09-26]{pinyin,hanzi,tran} % \begin{syntax} % pinyin = <\TTF> \init{true} % hanzi = <\TTF> \init{true} % tran = <\TTF> \init{true} % \end{syntax} % 分别用于设置是å¦è¾“å‡ºæ‹¼éŸ³ã€æ±‰å—和译文,默认值为\textbf{true}。 % 该选项对\tn{hanzidialog}å‘½ä»¤æ— æ•ˆã€‚ % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.33\linewidth,gobble=5] % \centering % \hanziboxset{frametype=å’ª,framecolor=red,charf=\large, % fillcolor=yellow!40} % \hanzibox[pinyin=false]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \hanzibox[hanzi=false]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \hanzibox[tran=false]{æ˜Žæœˆå‡ æ—¶æœ‰}[] % [How long will the full moon appear?]\\[0.5ex] % \end{SideBySideExample} % \end{function} % % \subsection{ä½œæ–‡æ ¼å¼é€‰é¡¹} % % \begin{function}[added=2022-04-17,updated=2022-04-17]{gridsepv,gridcols} % \begin{syntax} % gridsepv = \meta{number} \init{4} % gridcols = \meta{integer} \init{20} % \end{syntax} % \oarg{gridsepv}ç”¨äºŽè®¾ç½®ä½œæ–‡æ ¼å行间间è·ï¼Œ % $\text{行间è·}=\text{å•个盒å高度}\times\frac{1}{number}$, % 默认值å–4。 % % \oarg{gridcols}ç”¨äºŽè®¾ç½®æ ¼åæ¯è¡Œçš„åˆ—æ•°ï¼Œé»˜è®¤å€¼å–20。 % % 这两个选项对\tn{hanzibox}å’Œ\tn{hanzidialog}å‘½ä»¤æ— æ•ˆã€‚ % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.50\linewidth,gobble=5] % \centering % \hanziboxset{frametype=å’ª,framecolor=red, % charf=\large,fillcolor=yellow!40} % \writegrid{3}\\ % \writegrid[gridsepv=0.5,gridcols=10]{3}\\ % \writegrid[gridsepv=1.0,gridcols=15]{3} % \end{SideBySideExample} % \end{function} % % \changes{v2.0.0}{2021/09/28}{åœ¨è¯´æ˜Žæ–‡æ¡£ä¸æ·»åŠ åº”ç”¨å®žä¾‹} % \changes{v2.2.0}{2021/10/07}{ä¸ºéƒ¨åˆ†å®žä¾‹æ·»åŠ æ‹¼éŸ³å››çº¿æ ¼} % % \section{应用实例} % % \pkg{hanzibox}å®åŒ…å¯ä»¥å¹¿æ³›ç”¨äºŽæ±‰å—å¦ä¹ çš„ç»ƒä¹ ä¸ã€‚ % % \subsection{拼一拼---å†™ä¸€å†™ç»ƒä¹ } % 利用å„ç§é€‰é¡¹çš„æœ‰æ•ˆç»„åˆï¼Œå¯ä»¥å®žçŽ°æ±‰å—æ‹¼ä¸€æ‹¼---å†™ä¸€å†™ç»ƒä¹ ã€‚ % % \textcolor[HTML]{AD1457}{注æ„:\tn{hspace*}命令ä¸çš„ % 傿•°\textbf{0.4pt}是边框线æ¡å®½åº¦ï¼Œè¯·æ ¹æ®å®žé™…情况调整}。 % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.32\linewidth,gobble=5] % \centering % \hanziboxset{frametype=ç”°,framecolor=blue, % charf=\Huge,pinyinf=\small} % \hanzibox{é—¨}\hspace*{-0.4pt}\hanzibox[hanzi=false]{å£} % \hfill % \hanzibox{生}\hspace*{-0.4pt}\hanzibox[hanzi=false]{æ—¥}\\ % \hanzibox{题}\hspace*{-0.4pt}\hanzibox[hanzi=false]{ç›®} % \hfill % \hanzibox[hanzi=false]{ç”°}\hspace*{-0.4pt}\hanzibox{野} % \end{SideBySideExample} % % \subsection{æ ‡æ³¨å£°æ¯ç»ƒä¹ } % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.32\linewidth,gobble=5] % \centering % \hanziboxset{frametype=å’ª,framecolor=red,charcolor=red, % pinyinline=true,charf=\Huge,pinyinf=\small,initial=false} % \hanzibox{é—¨å£}\hfill % \hanzibox{生日}\\ % \hanzibox{题目}\hfill % \hanzibox{田野} % \end{SideBySideExample} % % \subsection{æ ‡æ³¨éŸµæ¯ç»ƒä¹ } % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.32\linewidth,gobble=5] % \centering % \hanziboxset{frametype=å’ª,framecolor=red,charcolor=red, % pinyinline=true,charf=\Huge,pinyinf=\small,vowel=false} % \hanzibox{é—¨å£}\hfill % \hanzibox{生日}\\ % \hanzibox{题目}\hfill % \hanzibox{田野} % \end{SideBySideExample} % % \subsection{æ ‡æ³¨å£°è°ƒç»ƒä¹ } % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.32\linewidth,gobble=5] % \centering % \hanziboxset{frametype=å’ª,framecolor=red,charcolor=red, % pinyinline=true,charf=\Huge,pinyinf=\small,tone=false} % \hanzibox{é—¨å£}\hfill % \hanzibox{生日}\\ % \hanzibox{题目}\hfill % \hanzibox{田野} % \end{SideBySideExample} % % \subsection{éšæœºç”Ÿæˆç”Ÿè¯ç»ƒä¹ } % % å‡è®¾æå‰å‡†å¤‡äº†ç”Ÿè¯è¡¨\verb!\clist_set:Nn \l__words_clist!,则å¯ä»¥ä½¿ç”¨ % \LaTeX3çš„éšæœºå‡½æ•°éšæœºç”Ÿæˆç”Ÿè¯ç»ƒä¹ 题(æ¯æ¬¡ç¼–译å¯ä»¥å¾—到ä¸åŒçš„结果)。 % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.30\linewidth,gobble=5] % \ExplSyntaxOn % \clist_set:Nn \l__words_clist % { % {铅笔} , {æ©¡çš®} , {报纸} , % {头å‘} , {耳朵} , {眼ç›} , % {大象} , {èš‚èš} , {æ¾é¼ } , % {ç”·å©} , {åŒå¦} , {兄弟} , % {å¦ç”Ÿ} , {医生} , {护士} , % {è€å¸ˆ} , {è¦å¯Ÿ} , {羊肉} , % {窗户} , {镜å} , {æ²™å‘} % } % \hanziboxset{frametype=å’ª,framecolor=red,charcolor=red, % charf=\huge,pinyinf=\footnotesize,hanzi=false} % \centering % \int_step_inline:nn {6} % { % \hanzibox{\clist_rand_item:N \l__words_clist}\\ % } % \ExplSyntaxOff % \end{SideBySideExample} % % \subsection{éšæœºç”Ÿæˆæ‹¼éŸ³ç»ƒä¹ } % % å‡è®¾æå‰å‡†å¤‡äº†å£°æ¯å’ŒéŸµæ¯è¡¨ï¼Œåˆ™å¯ä»¥ä½¿ç”¨ % \LaTeX3çš„éšæœºå‡½æ•°éšæœºç”Ÿæˆæ‹¼éŸ³ç»ƒä¹ 题(æ¯æ¬¡ç¼–译å¯ä»¥å¾—到ä¸åŒçš„结果)。 % æ¤æ—¶ï¼Œè‹¥ç”Ÿæˆçš„æ‹¼éŸ³ä¸æ£ç¡®ï¼Œå¯è®©å¦ç”Ÿå¡«å†™â€œæ— â€ã€‚ % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.25\linewidth,gobble=5] % \ExplSyntaxOn % \int_new:N \l__tone_int % \clist_set:Nn \l__initials_clist % { % {zh} , {ch} , {sh} , {b} , {p} , {m} , {f} , % {d} , {t} , {n} , {l} , {g} , {k} , {h} , % {j} , {q} , {x} , {r} , {z} , {c} , {s} , % {y} , {w} % } % \clist_set:Nn \l__vowel_clist % { % {iang} , {iong} , {uang} , {ueng} , {ang} , {eng} , {ing} , % {ong} , {uai} , {uan} , {uai} , {uei} , {iao} , {iou} , % {ian} , {van} , {uen} , {ai} , {ei} , {ua} , {uo} , % {ui} , {ao} , {ou} , {iu} , {ie} , {ve} , {er} , % {an} , {en} , {in} , {un} , {vn} , {a} , {e} , % {i} , {o} , {u} , {v} % } % \hanziboxset{frametype=å’ª,framecolor=red,charcolor=red, % charf=\huge,pinyinf=\footnotesize,hanzi=false} % \centering % \int_step_inline:nn {10} % { % \int_zero:N \l__tone_int % \int_set:Nn \l__tone_int {\int_rand:n {5}} % \hanzibox*{好}[ % \clist_rand_item:N \l__initials_clist % \clist_rand_item:N \l__vowel_clist % \int_use:N \l__tone_int % ]\\ % } % \ExplSyntaxOff % \end{SideBySideExample} % % \changes{v2.1.1}{2021/10/07}{åœ¨æ ¼å纸示例ä¸ç”¨coffin实现æ¯è¡Œæ ¼å以æå‡ç¼–译速度} % % \subsection{ç”Ÿæˆæ±‰å—å—å¸–æ ¼å纸} % % å¯ä»¥é€šè¿‡å°†\tn{hanzibox}命令的\Arg{汉å—}傿•°ç•™ç©ºï¼Œå¹¶è®¾ç½®\verb!tran=false!, % 或将\tn{hanzibox}ã€\tn{hanzibox*}命令的\verb!hanzi!选项置为 % \verb!false!(\verb!hanzi=false!),从而生æˆç©ºç™½èƒŒæ™¯æ ¼å, % 冿 ¹æ®éœ€è¦é€šè¿‡å¾ªçŽ¯çš„æ–¹å¼ç”ŸæˆæŒ‡å®šè¡Œæ•°å’Œåˆ—æ•°çš„ % 汉å—ä¹¦å†™ç»ƒä¹ ç”¨æ ¼å纸。 % % \textcolor[HTML]{AD1457}{注æ„ï¼šå‚æ•°ä¸çš„\textbf{0.4pt}是边框线æ¡å®½åº¦ï¼Œ % è¯·æ ¹æ®å®žé™…情况调整}。 % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.37\linewidth,gobble=5] % \hanziboxset{frametype=å’ª,framecolor=red, % tran=false,charcolor=red,charf=\huge} % \centering % \ExplSyntaxOn % \hcoffin_set:Nn \l_tmpa_coffin % { % \int_step_inline:nn {6} % { % \hanzibox{} % \hspace*{-0.40pt} % } % } % \hcoffin_set:Nn \l_tmpb_coffin % {} % \int_step_inline:nn {8} % { % \coffin_join:NnnNnnnn \l_tmpb_coffin { hc } { b } % \l_tmpa_coffin { hc } { t } { 0pt } { 0.4pt } % } % \coffin_typeset:Nnnnn % \l_tmpb_coffin { l } { b } { 0pt } { 0pt } % \ExplSyntaxOff % \end{SideBySideExample} % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.37\linewidth,gobble=5] % \hanziboxset{frametype=å’ª,framecolor=red, % pinyinline=true,charf=\huge,hanzi=false} % \centering % \ExplSyntaxOn % \hcoffin_set:Nn \l_tmpa_coffin % { % \int_step_inline:nn {6} % { % \hanzibox*{国} % \hspace*{-0.40pt} % } % } % \int_step_inline:nn {8} % { % \coffin_typeset:Nnnnn % \l_tmpa_coffin { l } { b } { 0pt } { 0pt } % \par\nointerlineskip % } % \ExplSyntaxOff % \end{SideBySideExample} % % \subsection{生æˆä½œæ–‡é¢˜ç›®æ ¼å纸} % % å¯ä»¥ä½¿ç”¨æœ¬å®åŒ…æä¾›çš„\tn{writegrid}命令生æˆä½œæ–‡é¢˜ç›®ä¸ç”¨äºŽç”题的 % æ ¼å¼çº¸ã€‚ % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.48\linewidth,gobble=5] % \hanziboxset{frametype=å£,framecolor=black, % charcolor=red,charf=\huge} % \centering % \writegrid[gridcols=8]{10} % \end{SideBySideExample} % % \subsection{生æˆè¯—è¯æ³¨éŸ³} % % å¯ä»¥é€šè¿‡è‡ªåŠ¨æ³¨éŸ³ç”Ÿæˆå¸¦æœ‰æ³¨éŸ³çš„è¯—è¯æŽ’ç‰ˆï¼Œ % ä½†å½“æœ‰å¤šéŸ³å—æ—¶ï¼Œéœ€è¦ä½¿ç”¨\pkg{xpinyin}å®åŒ…çš„\tn{setpinyin}命令 % 为多音å—设置æ£ç¡®çš„读音。 % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.50\linewidth,gobble=5] % \setpinyin{é•¿}{chang2} % \setpinyin{å°½}{jin4} % \hanziboxset{frametype=å’ª,framecolor=red, % charf=\huge,pinyinf=\footnotesize, % charcolor=green!40!black, % pinyincolor=green!40!black, % trancolor=green!40!black} % \centering % \hanzibox{故人西辞黄鹤楼} % \hanzibox{烟花三月下扬州} % \hanzibox{å¤å¸†è¿œå½±ç¢§ç©ºå°½} % \hanzibox{唯è§é•¿æ±Ÿå¤©é™…æµ} % \end{SideBySideExample} % % \subsection{è¯—è¯æ‰‹åŠ¨æ³¨éŸ³} % % 也å¯ä»¥ä½¿ç”¨\tn{hanzibox*}å‘½ä»¤å®žçŽ°è¯—è¯æ‰‹åŠ¨æ³¨éŸ³ï¼Œ % æ¤æ—¶ï¼Œå¯ä»¥é€šè¿‡ç•™ç©ºæ‹¼éŸ³æˆ–æ–‡å—æž„æˆæ³¨éŸ³æˆ–æ ¹æ®æ‹¼éŸ³å†™æ±‰å—ç»ƒä¹ ã€‚ % ä½†éœ€è¦æ³¨æ„,目å‰åªèƒ½åœ¨ä¸€è¡Œæ–‡æœ¬çš„å°¾éƒ¨å®žçŽ°ç•™ç©ºç»ƒä¹ ã€‚ % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.33\linewidth,gobble=5] % \hanziboxset{frametype=å’ª,framecolor=red,charf=\Large, % pinyinline=true,charcolor=green!40!black, % pinyincolor=red!20!black,trancolor=blue!40!black} % \centering % \hanzibox*{故人西辞黄鹤楼}[gu4ren2xi1ci2huang2he2lou2] % \hanzibox*{烟花三月下扬州}[yan1hua1san1yue4] % \hanzibox*{å¤å¸†è¿œå½± }[gu1fan1yuan3ying3bi4kong1jin4] % \hanzibox*{}[wei2jian4chang2jiang1tian1ji4liu2] % \end{SideBySideExample} % % \subsection{ç”Ÿæˆæçº¢ç»ƒä¹ } % % åˆç†çš„设置汉å—的颜色浓淡或通过\verb!charstroke!选项设置 % 汉å—轮廓选项,å¯ä»¥ç”Ÿæˆç”¨äºŽæçº¢ç»ƒä¹ çš„æ ¼å纸。 % % 若设置\verb!charstroke=invisible!,则会使汉å—éšè—ä¸å¯è§ï¼Œ % 但éšè—的汉å—ä»ç„¶å¯è¢«å¤åˆ¶ã€‚ % % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.25\linewidth,gobble=5] % \hanziboxset{frametype=å’ª,framecolor=red,pinyinline=true, % pinyincolor=green!30!black,charf=\Large,pinyinf=\footnotesize} % \centering % \hanzibox[charcolor=red!30,pinyincolor=red]{讲普通è¯} % \hanzibox[charcolor=black!30,pinyinline=false]{写规范å—} % \hanzibox[charcolor=red,charstroke=solid]{讲普通è¯} % \hanzibox[charcolor=black,charstroke=dashed]{写规范å—} % \hanzibox[charcolor=red,charstroke=invisible]{讲普通è¯} % \end{SideBySideExample} % % \end{documentation} % % \StopEventually{} % % \begin{implementation} % % \section{代ç 实现} % % 本å®åŒ…使用 \LaTeX3 è¯æ³•编写,ä¾èµ– \pkg{expl3} 环境, % 并需调用 \pkg{l3packages}ã€\pkg{l3draw}ã€\pkg{xpinyin}ç‰å®åŒ…。 % % 按照 \LaTeX3 è¯æ³•,代ç ä¸çš„ç©ºæ ¼ã€æ¢è¡Œã€å›žè½¦ä¸Žåˆ¶è¡¨ç¬¦ä¼šå®Œå…¨è¢«å¿½ç•¥ï¼Œ % 而下划线“|_|â€å’Œå†’å·â€œ|:|â€åˆ™å¯ä½œä¸ºä¸€èˆ¬å—æ¯ä½¿ç”¨ã€‚ % æ£å¸¸çš„ç©ºæ ¼å¯ä»¥ä½¿ç”¨â€œ|~|â€ä»£æ›¿ï¼›è‡³äºŽ |~| åŽŸæ¥æ‰€è¡¨ç¤ºçš„“带åâ€ï¼Œ % 则è¦ç”¨ \LaTeXe{} 的原始命令 \tn{nobreakspace} 代替。 % % 以下代ç 䏿œ‰ä¸€äº›å½¢å¦‚ \textcolor[HTML]{2E3191}{\textsf{<*package>}} % çš„æ ‡è®°ï¼Œè¿™æ˜¯ \pkg{DocStrip} ä¸çš„“guardâ€ï¼Œç”¨æ¥é€‰æ‹©æ€§åœ°æå–文件。 % “\textsf{*}â€å’Œâ€œ\textsf{/}â€åˆ†åˆ«è¡¨ç¤ºè¯¥éƒ¨åˆ†çš„开始和结æŸã€‚ä¸å« % “\textsf{*}â€å’Œâ€œ\textsf{/}â€çš„ guard 出现在行å·å³ä¾§ï¼Œå®ƒä»¬ç”¨æ¥ç¡®å®š % å•独一行代ç 的归属。这些 guard 的颜色深浅ä¸ä¸€ï¼Œç”¨ä»¥æ˜Žç¡®åµŒå¥—关系。 % % 妿œ‰è‹¥å¹²å½¢å¦‚ \textcolor[HTML]{AD1457}{\textsf{<@@=hanzibox>}} çš„ guard, % 它们由 \pkg{l3docstrip} å®šä¹‰ï¼Œç”¨æ¥æ ‡è¯†åå—空间(模å—)。 % % \subsection{环境检测与准备} % % \begin{macrocode} %<*package> %<@@=hanzibox> % \end{macrocode} % % 载入必è¦çš„å®åŒ… % % \begin{macrocode} \RequirePackage { xtemplate, l3keys2e, l3draw, xparse } % \end{macrocode} % % 检查LaTeX3å®åŒ…版本 % % \begin{macrocode} % \clist_map_inline:nn { xtemplate, l3keys2e } % { % \@ifpackagelater {#1} { 2020/07/17 } % { } { \msg_error:nnn { hanzibox } { l3-too-old } {#1} } % } % \msg_new:nnn { hanzibox } { l3-too-old } % { % Package~ "#1"~ is~ too~ old. \\\\ % Please~ update~ an~ up-to-date~ version~ of~ the~ bundles \\ % "l3kernel"~ and~ "l3packages"~ using~ your~ TeX~ package \\ % manager~ or~ from~ CTAN. % } % % \end{macrocode} % % \changes{v2.1.1}{2021/10/03}{解决盒å高度计算函数的expl3版本兼容问题} % % 判æ–\tn{box_ht_plus_dp:N}函数是å¦å˜åœ¨ï¼Œè‹¥ä¸å˜åœ¨ï¼Œåˆ™å®šä¹‰è¯¥å‡½æ•°ã€‚ % 为了解决与expl3的旧版本兼容问题( % 摘录于\url{https://ask.latexstudio.net/ask/question/3773.html})。 % % \begin{macrocode} \cs_if_free:NT \box_ht_plus_dp:N { \cs_new_protected:Npn \box_ht_plus_dp:N #1 { \tex_dimexpr:D \box_ht:N #1 + \box_dp:N #1 \scan_stop: } } % \end{macrocode} % % 检查编译引擎,目å‰ä»…支æŒxetex引擎。 % % \begin{macrocode} \sys_if_engine_xetex:F { \msg_fatal:nnx { hanzibox } { unsupported-engine } { \c_sys_engine_str } } \msg_new:nnn { hanzibox } { unsupported-engine } { The~ hanzibox~ packages~ requires~ XeTeX. \\\\ "#1"~ is~ not~ supported~ at~ present.~ You~ must~ change \\ your~ typesetting~ engine~ to~ "xelatex"~ or~ "lualatex". } % \end{macrocode} % % 载入xpinyinå®åŒ… % % \begin{macrocode} \RequirePackage { xpinyin } % \end{macrocode} % % \subsection{用户接å£} % % \changes{v1.1.0}{2021/09/22}{ä¸ºç”¨æˆ·å‘½ä»¤æ·»åŠ ç»„é™åˆ¶} % \changes{v2.0.0}{2021/09/26}{调整星å·å‘½ä»¤ä¸ºæ‰‹åŠ¨æ‹¼éŸ³æ³¨éŸ³} % 背景盒åç”±l3draw实现, % 其设计æ€è·¯å’Œéƒ¨åˆ†æºç æ¥è‡ª\LaTeX çš„\pkg{zitie}å®åŒ…(\url{https://www.ctan.org/pkg/zitie})。 % % \begin{macro}{\hanzibox} % 自动注音汉å—ç›’å命令。 % \begin{macrocode} \NewDocumentCommand{\hanzibox}{ s O{} m O{} O{} } { \IfBooleanTF{#1} { \bool_set_false:N \l_@@_autopinyin_bool }{ \bool_set_true:N \l_@@_autopinyin_bool } \group_begin: \@@_handle:nnnn { #2 } { #3 } { #4 } { #5 } \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\hanzidialog} % 手动注音汉å—ç›’å命令。 % \begin{macrocode} \NewDocumentCommand{\hanzidialog}{O{} m O{} O{} } { \group_begin: \bool_set_false:N \l_@@_autopinyin_bool \@@_dialog:nnnn { #1 } { #2 } { #3 } { #4 } \group_end: } % \end{macrocode} % \end{macro} % % \changes{v2.3.0}{2022/04/17}{æ·»åŠ \tn{writegrid}ä½œæ–‡æ ¼å输出命令。} % % \begin{macro}{\writegrid} % 自动注音汉å—ç›’å命令。 % \begin{macrocode} \NewDocumentCommand{\writegrid}{ O{} m } { \group_begin: \@@_writegrid:nn { #1 } { #2 } \group_end: } % \end{macrocode} % \end{macro} % % \subsection{内部å˜é‡å£°æ˜Ž} % % \changes{v1.1.0}{2021/09/21}{æ·»åŠ ç¼©æ”¾æ¯”ä¾‹ï¼Œå‰æ™¯/背景色,éšè—控制å˜é‡ã€‚} % \changes{v2.0.0}{2021/09/24}{æ ¹æ®l3draw的需è¦é‡æ–°è®¾è®¡å„个å˜é‡ã€‚} % \changes{v2.1.0}{2021/09/30}{æ·»åŠ è®°å½•æ‹¼éŸ³è¿”å›žç»“æžœçš„clistå˜é‡ã€‚} % \changes{v2.2.0}{2021/10/07}{æ·»åŠ æ‹¼éŸ³çº¿å¼€å…³åŠæ‹¼éŸ³å’Œè¯‘文颜色å˜é‡} % \changes{v2.2.0}{2021/10/08}{æ·»åŠ å—符轮廓类型选择å˜é‡} % \changes{v2.2.0}{2021/10/09}{æ·»åŠ æ‹¼éŸ³æ±‰å—coffinå˜é‡} % \changes{v2.3.0}{2022/04/17}{æ·»åŠ ä½œæ–‡æ ¼å垂直间è·ç³»æ•°å˜é‡åŠcoffinå˜é‡ã€‚} % % \begin{variable}{\l_@@_autopinyin_bool, % \l_@@_withinitial_bool, % \l_@@_withvowel_bool, % \l_@@_withtone_bool, % \l_@@_withpinyin_bool, % \l_@@_withpinyinlines_bool, % \l_@@_withhanzi_bool, % \l_@@_withtran_bool, % \l_@@_basebox_box, % \l_@@_frame_type_tl, % \g_@@_frame_list_clist, % \l_@@_resize_method_tl, % \g_@@_resize_method_clist, % \l_@@_frame_size_dim, % \l_@@_char_width_dim, % \l_@@_char_height_dim, % \l_@@_pinyin_height_i_dim, % \l_@@_pinyin_height_ii_dim, % \l_@@_pinyin_height_iii_dim, % \l_@@_box_width_dim, % \l_@@_box_height_dim, % \l_@@_frame_linewidth_dim, % \l_@@_pinyin_linewidth_dim, % \l_@@_cross_linewidth_dim, % \l_@@_tone_pinyin_clist, % \l_@@_str_box_coffin, % \l_@@_box_coffin, % \l_@@_pinyin_box_coffin, % \l_@@_tran_box_coffin, % \l_@@_pinyin_hanzi_coffin, % \l_@@_tmpa_coffin, % \l_@@_tmpb_coffin, % \l_@@_grid_coffin, % \l_@@_grid_tmpa_coffin, % \l_@@_grid_tmpb_coffin, % \hanziboxwidth, % \hanziboxheight, % \l_@@_pinyin_tl, % \l_@@_character_tl, % \l_@@_translation_tl, % \l_@@_pinyin_format_tl, % \l_@@_character_format_tl, % \l_@@_translation_format_tl, % \l_@@_cross_color_ratio_int, % \l_@@_pinyin_int, % \l_@@_character_int, % \l_@@_translation_int, % \l_@@_charstroke_type_int, % \l_@@_grid_cols_int, % \l_@@_tone_int, % \l_@@_pinyin_str, % \l_@@_initial_tl, % \l_@@_vowel_tl, % \l_@@_grid_sep_v_tl, % } % 定义å˜é‡ã€‚ % % \begin{macrocode} \bool_new:N \l_@@_autopinyin_bool \bool_new:N \l_@@_withinitial_bool \bool_new:N \l_@@_withvowel_bool \bool_new:N \l_@@_withtone_bool \bool_new:N \l_@@_withpinyin_bool \bool_new:N \l_@@_withpinyinlines_bool \bool_new:N \l_@@_withhanzi_bool \bool_new:N \l_@@_withtran_bool \box_new:N \l_@@_basebox_box \tl_new:N \l_@@_frame_type_tl \clist_new:N \g_@@_frame_list_clist \tl_new:N \l_@@_resize_method_tl \clist_new:N \g_@@_resize_method_clist \dim_new:N \l_@@_frame_size_dim \dim_new:N \l_@@_char_width_dim \dim_new:N \l_@@_char_height_dim \dim_new:N \l_@@_pinyin_height_i_dim \dim_new:N \l_@@_pinyin_height_ii_dim \dim_new:N \l_@@_pinyin_height_iii_dim \dim_new:N \l_@@_box_width_dim \dim_new:N \l_@@_box_height_dim \dim_new:N \l_@@_frame_linewidth_dim \dim_new:N \l_@@_pinyin_linewidth_dim \dim_new:N \l_@@_cross_linewidth_dim \clist_new:N \l_@@_tone_pinyin_clist \coffin_new:N \l_@@_str_box_coffin \coffin_new:N \l_@@_box_coffin \coffin_new:N \l_@@_pinyin_box_coffin \coffin_new:N \l_@@_tran_box_coffin \coffin_new:N \l_@@_pinyin_hanzi_coffin \coffin_new:N \l_@@_tmpa_coffin \coffin_new:N \l_@@_tmpb_coffin \coffin_new:N \l_@@_grid_coffin \coffin_new:N \l_@@_grid_tmpa_coffin \coffin_new:N \l_@@_grid_tmpb_coffin \dim_new:N \hanziboxwidth \dim_new:N \hanziboxheight \tl_new:N \l_@@_pinyin_tl \tl_new:N \l_@@_character_tl \tl_new:N \l_@@_translation_tl \tl_new:N \l_@@_pinyin_format_tl \tl_new:N \l_@@_character_format_tl \tl_new:N \l_@@_translation_format_tl \int_new:N \l_@@_cross_color_ratio_int \int_new:N \l_@@_pinyin_int \int_new:N \l_@@_character_int \int_new:N \l_@@_translation_int \int_new:N \l_@@_charstroke_type_int \int_new:N \l_@@_grid_cols_int \int_new:N \l_@@_tone_int \str_new:N \l_@@_pinyin_str \tl_new:N \l_@@_initial_tl \tl_new:N \l_@@_vowel_tl \tl_new:N \l_@@_grid_sep_v_tl % \end{macrocode} % \end{variable} % % \subsection{辅助函数} % % \subsubsection{设置填充色} % % \begin{macro}{\@@_aux_color_fill:} % 设置空白填充色 % \begin{macrocode} \cs_new_nopar:Nn \@@_aux_color_fill: { } % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{æ·»åŠ æ‹¼éŸ³é«˜åº¦è®¡ç®—å‡½æ•°} % % \subsubsection{计算拼音高度} % % \begin{macro}{\@@_calc_pinyin_h:} % 计算拼音线基础调试(é€šè¿‡å—æ¯"a"的高度计算) % \begin{macrocode} \cs_new:Npn \@@_calc_pinyin_h: { \hbox_set:Nn \l_tmpa_box { \tl_use:N \l_@@_pinyin_format_tl a } \dim_set:Nn \l_@@_pinyin_height_i_dim { \box_ht:N \l_tmpa_box } \dim_set:Nn \l_@@_pinyin_height_ii_dim { \l_@@_pinyin_height_i_dim + \l_@@_pinyin_height_i_dim } \dim_set:Nn \l_@@_pinyin_height_iii_dim { \l_@@_pinyin_height_i_dim + \l_@@_pinyin_height_i_dim + \l_@@_pinyin_height_i_dim } } % \end{macrocode} % \end{macro} % % \subsubsection{计算盒å尺寸} % % \begin{macro}{\@@_calc_basechar_w_h:} % 计算基å—符盒å宽和高 % \begin{macrocode} \cs_new:Npn \@@_calc_basechar_w_h: { \dim_set:Nn \l_@@_char_width_dim { \box_wd:N \l_@@_basebox_box } \dim_set:Nn \l_@@_char_height_dim { \box_ht_plus_dp:N \l_@@_basebox_box } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_coffin_ht_plus_dp:N} % 获å–coffinç›’åæ€»é«˜åº¦ % \begin{macrocode} \cs_new_nopar:Npn \@@_coffin_ht_plus_dp:N #1 { \coffin_ht:N #1 + \coffin_dp:N #1 } % \end{macrocode} % \end{macro} % % \changes{v2.0.0}{2021/09/28}{æ·»åŠ æ ¹æ®åŸºå—ç¬¦æ ¼å¼è®¡ç®—ç›’å尺寸函数} % % \begin{macro}{\@@_calc_frame_size:} % 计算外框长度(æ£æ–¹å½¢ï¼Œç”±åŸºå—符按charfé€‰é¡¹è®¾å®šçš„æ ¼å¼æž„é€ çš„ç›’å确定) % \begin{macrocode} \cs_new:Npn \@@_calc_frame_size: { \hbox_set:Nn \l_tmpa_box { \tl_use:N \l_@@_character_format_tl \tl_use:N \c_@@_basechar_tl } \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } \dim_set:Nn \l_tmpb_dim { \box_ht_plus_dp:N \l_tmpa_box } \dim_compare:nNnTF \l_tmpa_dim > \l_tmpb_dim { \dim_gset_eq:NN \l_@@_frame_size_dim \l_tmpa_dim } { \dim_gset_eq:NN \l_@@_frame_size_dim \l_tmpb_dim } \dim_gadd:Nn \l_@@_frame_size_dim { 1pt } \dim_gset_eq:NN \hanziboxwidth \l_@@_frame_size_dim \dim_gset_eq:NN \hanziboxheight \l_@@_frame_size_dim } % \end{macrocode} % \end{macro} % % \subsubsection{å®šä¹‰è¾¹æ¡†æ ·å¼} % % \begin{macro}{\@@_frame_type:n,\@@_frame_type_c:n} % 生æˆè¾¹æ¡†æ ·å¼å‡½æ•°åç§° % \begin{macrocode} \cs_new_nopar:Npn \@@_frame_type:n #1 { @@_frame_construct_type_ #1 :nnnnnn } \cs_new_nopar:Npn \@@_frame_type_c:n #1 { \use:c { @@_frame_construct_type_ #1 :nnnnnn } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_new_frame_construct:nn} % è¾¹æ¡†æ ·å¼å‡½æ•°çš„定义函数。 % \begin{macrocode} \cs_new:Npn \@@_new_frame_construct:nn #1 { \clist_put_right:Nn \g_@@_frame_list_clist {#1} \cs_new:cn { \@@_frame_type:n {#1} } } \@@_new_frame_construct:nn { none } { } % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{æ·»åŠ æ‹¼éŸ³å››çº¿æ ¼ç»˜åˆ¶å‡½æ•°} % % \begin{macrocode} \@@_new_frame_construct:nn { pinyinlines } { \bool_if:NTF \l_@@_withpinyinlines_bool { \draw_scope_begin: \draw_path_moveto:n { #1, 0 } \draw_path_lineto:n { #3, 0 } \draw_path_moveto:n { #1, \l_@@_pinyin_height_i_dim } \draw_path_lineto:n { #3, \l_@@_pinyin_height_i_dim } \draw_path_moveto:n { #1, \l_@@_pinyin_height_ii_dim } \draw_path_lineto:n { #3, \l_@@_pinyin_height_ii_dim } \draw_path_moveto:n { #1, \l_@@_pinyin_height_iii_dim } \draw_path_lineto:n { #3, \l_@@_pinyin_height_iii_dim } \draw_path_use_clear:n { stroke } \draw_scope_end: } { \draw_scope_begin: \hcoffin_set:Nn \l_tmpa_coffin { \tl_use:N \l_@@_pinyin_format_tl \phantom{a} } \coffin_resize:Nnn \l_tmpa_coffin { #3 } { \l_@@_pinyin_height_iii_dim } \draw_coffin_use:Nnn \l_tmpa_coffin { l } { b } \draw_scope_end: } } % \end{macrocode} % % \changes{v2.1.2}{2021/10/07}{分离汉å—外框与填充绘制函数} % % \begin{macrocode} \@@_new_frame_construct:nn { filledbox } { \cs_if_eq:NNF \@@_aux_color_fill: \c_empty_tl { \color_stroke:n { hanziboxframecolor } \draw_path_rectangle_corners:nn { #1, #2} { #3, #4} \draw_path_use_clear:n { stroke, fill } } } % \end{macrocode} % % \begin{macrocode} \@@_new_frame_construct:nn { framebox } { \draw_scope_begin: \color_stroke:n { hanziboxframecolor } \draw_path_rectangle_corners:nn { #1, #2} { #3, #4} \draw_path_use_clear:n { stroke } \draw_scope_end: } % \end{macrocode} % % \changes{v2.1.1}{2021/10/07}{å†…æ ¼å线颜色独立设置} % % \begin{macrocode} \@@_new_frame_construct:nn { å } { \draw_scope_begin: \tl_if_empty:NF \l_@@_dash_pattern_tl { \exp_args:No \draw_dash_pattern:nn { \l_@@_dash_pattern_tl } { 0pt } } \draw_linewidth:n{ \l_@@_cross_linewidth_dim } \color_stroke:n { hanziboxcrosscolor } \draw_path_moveto:n { (#3)/2, #2 } \draw_path_lineto:n { #3/2, #4 } \draw_path_moveto:n { #1, (#4)/2 } \draw_path_lineto:n { #3, (#4)/2 } \draw_path_use_clear:n { stroke } \draw_scope_end: } \@@_new_frame_construct:nn { × } { \draw_scope_begin: \tl_if_empty:NF \l_@@_dash_pattern_tl { \exp_args:No \draw_dash_pattern:nn { \l_@@_dash_pattern_tl } { 0pt } } \draw_linewidth:n{ \l_@@_cross_linewidth_dim } \color_stroke:n { hanziboxcrosscolor } \draw_path_moveto:n { #1, #2 } \draw_path_lineto:n { #3, #4 } \draw_path_moveto:n { #1, #4 } \draw_path_lineto:n { #3, #2 } \draw_path_use_clear:n { stroke } \draw_scope_end: } \@@_new_frame_construct:nn { ç±³ } { \@@_frame_type_c:n { × } {#1} {#2} {#3} {#4} {#5} {#6} \@@_frame_type_c:n { å } {#1} {#2} {#3} {#4} {#5} {#6} } \@@_new_frame_construct:nn { å£ } { \@@_frame_type_c:n { filledbox } {#1} {#2} {#3} {#4} {#5} {#6} \@@_frame_type_c:n { framebox } {#1} {#2} {#3} {#4} {#5} {#6} } \@@_new_frame_construct:nn { ç”° } { \@@_frame_type_c:n { filledbox } {#1} {#2} {#3} {#4} {#5} {#6} \@@_frame_type_c:n { å } {#1} {#2} {#3} {#4} {#5} {#6} \@@_frame_type_c:n { framebox } {#1} {#2} {#3} {#4} {#5} {#6} } \@@_new_frame_construct:nn { å’ª } { \@@_frame_type_c:n { filledbox } {#1} {#2} {#3} {#4} {#5} {#6} \@@_frame_type_c:n { × } {#1} {#2} {#3} {#4} {#5} {#6} \@@_frame_type_c:n { å } {#1} {#2} {#3} {#4} {#5} {#6} \@@_frame_type_c:n { framebox } {#1} {#2} {#3} {#4} {#5} {#6} } % \end{macrocode} % % \subsubsection{定义边框类型错误æç¤ºä¿¡æ¯} % % \begin{macrocode} \msg_new:nnn { hanzibox } { frame-exists } { The~ frame~ type~ `#1~ not~ exists. } % \end{macrocode} % % \subsubsection{定义缩放方å¼} % % \begin{macro}{\@@_resize:n,\@@_resize_c:n} % 生æˆç¼©æ”¾æ–¹å¼å‡½æ•°åç§° % \begin{macrocode} \cs_new_nopar:Npn \@@_resize:n #1 { @@_processor_resize_ #1 :w } \cs_new_nopar:Npn \@@_resize_c:n #1 { \use:c { @@_processor_resize_ #1 :w } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_dim_gezero_dispatch:NNnnn,\@@_dim_gezero_dispatch:NNnnn, % \@@_force_size_dispatch:nnn,\@@_force_size_dispatch:nnnn} % 定义缩放方å¼å‡½æ•°éœ€è¦çš„辅助函数。 % \begin{macrocode} \cs_new:Npn \@@_dim_gezero_dispatch:NNnnn #1#2 #3#4#5 { \dim_compare:nNnTF #1 > \c_zero_dim { #3 } { \dim_compare:nNnTF #2 > \c_zero_dim { #4 } { #5 } } } \cs_new:Npn \@@_dim_gezero_dispatch:NNnnnn #1#2 #3#4#5#6 { \dim_compare:nNnTF #1 > \c_zero_dim { \dim_compare:nNnTF #2 > \c_zero_dim { #3 } { #4 } } { \dim_compare:nNnTF #2 > \c_zero_dim { #5 } { #6 } } } \cs_new:Npn \@@_force_size_dispatch:nnn % height, width, none { \@@_dim_gezero_dispatch:NNnnn \l_@@_height_dim \l_@@_width_dim } \cs_new:Npn \@@_force_size_dispatch:nnnn % both, height, width, none { \@@_dim_gezero_dispatch:NNnnnn \l_@@_box_height_dim \l_@@_box_width_dim } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_new_resize_method:nn} % 构建缩放方å¼åˆ—表åŠå‡½æ•°ã€‚ % \begin{macrocode} \cs_new:Npn \@@_new_resize_method:nn #1 { \clist_put_right:Nn \g_@@_resize_method_clist {#1} \cs_new:cpn { \@@_resize:n {#1} } } % \end{macrocode} % \end{macro} % % \changes{v2.0.0}{2021/09/28}{åˆ é™¤squareç¼©æ”¾æ ·å¼} % % 定义缩放方å¼å‡½æ•°ã€‚ % \begin{macrocode} \@@_new_resize_method:nn { none } { } \@@_new_resize_method:nn { real } { \@@_force_size_dispatch:nnnn { \coffin_resize:Nnn \l_@@_box_coffin \l_@@_box_width_dim \l_@@_box_height_dim } { \coffin_scale:Nnn \l_@@_box_coffin { \dim_ratio:nn { \l_@@_box_height_dim } { \@@_coffin_ht_plus_dp:N \l_@@_box_coffin } } { \dim_ratio:nn { \l_@@_box_height_dim } { \@@_coffin_ht_plus_dp:N \l_@@_box_coffin } } } { \coffin_scale:Nnn \l_@@_box_coffin { \dim_ratio:nn { \l_@@_box_width_dim } { \coffin_wd:N \l_@@_box_coffin } } { \dim_ratio:nn { \l_@@_box_width_dim } { \coffin_wd:N \l_@@_box_coffin } } } { \coffin_scale:Nnn \l_@@_box_coffin { \l_@@_x_scale_tl } { \l_@@_y_scale_tl } } } \@@_new_resize_method:nn { base } { \@@_force_size_dispatch:nnnn { \coffin_resize:Nnn \l_@@_box_coffin \l_@@_box_width_dim \l_@@_box_height_dim } { \coffin_resize:Nnn \l_@@_box_coffin { \l_@@_char_width_dim * \dim_ratio:nn { \l_@@_box_height_dim } { \@@_coffin_ht_plus_dp:N \l_@@_box_coffin } } { \l_@@_box_height_dim } } { \coffin_resize:Nnn \l_@@_box_coffin { \l_@@_box_width_dim } { \l_@@_char_height_dim * \dim_ratio:nn { \l_@@_box_width_dim } { \coffin_wd:N \l_@@_box_coffin } } } { \coffin_resize:Nnn \l_@@_box_coffin { \l_@@_x_scale_tl \l_@@_char_width_dim } { \l_@@_y_scale_tl \l_@@_char_height_dim } } } \msg_new:nnn { hanzibox } { frame-type } { using~ `#1'~ frame. } % \end{macrocode} % % \subsubsection{设置å—å·} % % \begin{macro}{\@@_zihao:n} % 设置å—å· % \begin{macrocode} \cs_new_nopar:Npn \@@_zihao:n #1 { \zihao {#1} } % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/08}{æ·»åŠ å—符轮廓处ç†å‡½æ•°} % % \subsubsection{å—符轮廓处ç†å‡½æ•°} % æºç 改自\LaTeX çš„\pkg{zitie}å®åŒ…(\url{https://www.ctan.org/pkg/zitie})。 % % \begin{macro}{\@@_chars_stroke:nn} % 设置å—符轮廓函数 % \begin{macrocode} \cs_new:Npn \@@_chars_stroke:nn #1#2 { \special { pdf:code ~ q ~ #1 } #2 \special { pdf:code ~ Q } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_chars_stroke:nn} % å—符轮廓选择函数 % \begin{macrocode} \cs_new_protected:Npn \@@_chars_stroke_construct:n #1 { \int_case:nn {\l_@@_charstroke_type_int} { {1}{ #1 } {2}{ \@@_chars_stroke:nn { 1 ~ Tr ~ 0.10 ~ w ~ [] ~ 0 ~ d ~ 1 ~ J } {#1} } {3}{ \@@_chars_stroke:nn { 1 ~ Tr ~ 0.10 ~ w ~ [1~1] ~ 0 ~ d ~ 1 ~ J } {#1} } {4}{ \@@_chars_stroke:nn { 3 ~ Tr } {#1} } } } \cs_generate_variant:Nn \@@_chars_stroke_construct:n { V } \cs_generate_variant:Nn \@@_chars_stroke_construct:n { x } % \end{macrocode} % \end{macro} % % \subsubsection{命å颜色} % % \begin{macro}{\@@_color_select:nn,\@@_color_select:nnn} % 颜色命å函数(使用l3è¯æ³•) % \begin{macrocode} \cs_set_nopar:Npn \@@_color_select:nn #1#2 { \color_set:nn {#1} {#2} } \cs_generate_variant:Nn \@@_color_select:nn {nx} \cs_set_nopar:Npn \@@_color_select:nnn #1#2#3 { \color_set:nnn {#1} {#2} {#3} } \cs_generate_variant:Nn \@@_color_select:nnn {nnx} % \end{macrocode} % \end{macro} % % \subsubsection{设置Debug状æ€} % % \begin{macro}{\@@_debug:n} % 设置debugçŠ¶æ€ % \begin{macrocode} \cs_new:Npn \@@_debug:n { \bool_if:NTF \l_@@_debug_bool { \use:n } { \use_none:n } } % \end{macrocode} % \end{macro} % % \subsection{选项处ç†} % % \changes{v2.0.0}{2021/09/25}{å‚考zitieå®åŒ…ï¼Œé‡æ–°è®¾è®¡é€‰é¡¹ï¼Œ % ä»…ä¿ç•™1.1.0版本ä¸çš„æ‹¼éŸ³ã€æ±‰å—ã€è¯‘文显示控制选项。} % % 定义 |hanzibox| 键值类。 % \begin{macrocode} \keys_define:nn { hanzibox } { % \end{macrocode} % % \begin{macro}{basechar} % 设置基å—符。 % \begin{macrocode} basechar .code:n = { \tl_gset:Nx \c_@@_basechar_tl {#1} \@@_calc_basechar_w_h: }, % \end{macrocode} % \end{macro} % % \begin{macro}{zihao} % 设置å—å·ã€‚ % \begin{macrocode} zihao .code:n = { \hbox_gset:Nn \l_@@_basebox_box { \@@_zihao:n {#1} \c_@@_basechar_tl } \@@_calc_basechar_w_h: }, % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{为pinyinfé€‰é¡¹å¢žåŠ è®¡ç®—æ‹¼éŸ³é«˜åº¦åŠŸèƒ½} % % \begin{macro}{pinyinf} % æ‹¼éŸ³æ ¼å¼ % \begin{macrocode} pinyinf .code:n = { \tl_set:Nn \l_@@_pinyin_format_tl { #1 } \@@_calc_pinyin_h: }, pinyinf .initial:n = \tiny , % \end{macrocode} % \end{macro} % % \begin{macro}{charf} % æ±‰å—æ ¼å¼ % \begin{macrocode} charf .code:n = { \tl_gset:Nn \l_@@_character_format_tl {#1} \@@_calc_frame_size: }, % \end{macrocode} % \end{macro} % % \begin{macro}{tranf} % è¯‘æ–‡æ ¼å¼ % \begin{macrocode} tranf .tl_set:N = \l_@@_translation_format_tl , tranf .initial:n = \tiny , % \end{macrocode} % \end{macro} % % \begin{macro}{frametype} % 边框类型 % \begin{macrocode} frametype .code:n = { \exp_args:NNx \clist_if_in:NnTF \g_@@_frame_list_clist {#1} { \tl_set:Nx \l_@@_frame_type_tl {#1} } { \msg_error:nnx { hanzibox } { frame-exists } {#1} } }, % \end{macrocode} % \end{macro} % % \begin{macro}{resize} % ç¼©æ”¾æ–¹å¼ % \begin{macrocode} resize .code:n = { \exp_args:NNx \clist_if_in:NnTF \g_@@_resize_method_clist {#1} { \tl_set:Nx \l_@@_resize_method_tl {#1} } { \msg_error:nnx { hanzibox } { resize-method } {#1} } }, % \end{macrocode} % \end{macro} % % \begin{macro}{xscale} % xæ–¹å‘缩放比例 % \begin{macrocode} xscale .tl_set:N = \l_@@_x_scale_tl , xscale .initial:n = 1 , % \end{macrocode} % \end{macro} % % \begin{macro}{yscale} % yæ–¹å‘缩放比例 % \begin{macrocode} yscale .tl_set:N = \l_@@_y_scale_tl , yscale .initial:n = 1 , % \end{macrocode} % \end{macro} % % \begin{macro}{scale} % x,yæ–¹å‘缩放比例 % \begin{macrocode} scale .meta:n = { xscale = #1 , yscale = #1 } , % \end{macrocode} % \end{macro} % % \begin{macro}{width} % ç›’å宽度 % \begin{macrocode} width .dim_set:N = \l_@@_box_width_dim , % \end{macrocode} % \end{macro} % % \begin{macro}{height} % ç›’å高度 % \begin{macrocode} height .dim_set:N = \l_@@_box_height_dim , % \end{macrocode} % \end{macro} % % \begin{macro}{linewidth} % 外框线æ¡å®½åº¦ % \begin{macrocode} linewidth .dim_set:N = \l_@@_frame_linewidth_dim , linewidth .initial:n = 0.4pt , % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/10}{æ·»åŠ è¾¹æ¡†çº¿çº¿å®½\opt{framelinewidth}选项} % % \begin{macro}{framelinewidth} % 外框线æ¡å®½åº¦ % \begin{macrocode} framelinewidth .dim_set:N = \l_@@_frame_linewidth_dim , framelinewidth .initial:n = 0.4pt , % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/10}{æ·»åŠ æ‹¼éŸ³å››çº¿æ ¼çº¿å®½pinyinlinewidth选项} % % \begin{macro}{pinyinlinewidth} % æ‹¼éŸ³å››çº¿æ ¼çº¿æ¡å®½åº¦ % \begin{macrocode} pinyinlinewidth .dim_set:N = \l_@@_pinyin_linewidth_dim , pinyinlinewidth .initial:n = 0.4pt , % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/10}{æ·»åŠ å†…æ ¼åå—和米å—线线宽crosslinewidth选项} % % \begin{macro}{crosslinewidth} % å†…æ ¼åå—和米å—线线æ¡å®½åº¦ % \begin{macrocode} crosslinewidth .dim_set:N = \l_@@_cross_linewidth_dim , crosslinewidth .initial:n = 0.3pt , % \end{macrocode} % \end{macro} % % \changes{v2.1.1}{2021/10/07}{æ·»åŠ é¢œè‰²æ¯”ä¾‹é€‰é¡¹corsscolorratio} % % \begin{macro}{crosscolorratio} % ç›’å内部线æ¡é¢œè‰²å 边框颜色的百分比 % \begin{macrocode} crosscolorratio .int_set:N = \l_@@_cross_color_ratio_int, crosscolorratio .initial:n = 20, % \end{macrocode} % \end{macro} % % \begin{macro}{framecolor} % 边框颜色 % \begin{macrocode} framecolor .code:n = { \tl_set:Nx \l_tmpa_tl { #1 ! \int_use:N \l_@@_cross_color_ratio_int } \@@_color_select:nn { hanziboxframecolor } {#1} \@@_color_select:nx{ hanziboxcrosscolor } { \l_tmpa_tl } } , framecolor .initial:n = black , framecolor* .code:n = { \tl_set:Nx \l_tmpa_tl { #1 ! \int_use:N \l_@@_cross_color_ratio_int } \@@_color_select:nnn { hanziboxframecolor } #1 \@@_color_select:nnx { hanziboxcrosscolor } \l_tmpa_tl } , % \end{macrocode} % \end{macro} % % \begin{macro}{charcolor} % å—符颜色 % \begin{macrocode} charcolor .code:n = { \@@_color_select:nn { hanziboxcharcolor } {#1} } , charcolor .initial:n = black , charcolor* .code:n = { \@@_color_select:nnn { hanziboxcharcolor } #1 } , % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{æ·»åŠ æ‹¼éŸ³é¢œè‰²\opt{pinyincolor}选项} % % \begin{macro}{pinyincolor} % 拼音颜色 % \begin{macrocode} pinyincolor .code:n = { \@@_color_select:nn { hanziboxpinyincolor } {#1} } , pinyincolor .initial:n = black , pinyincolor* .code:n = { \@@_color_select:nnn { hanziboxpinyincolor } #1 } , % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{æ·»åŠ è¯‘æ–‡é¢œè‰²\opt{trancolor}选项} % % \begin{macro}{trancolor} % 译文颜色 % \begin{macrocode} trancolor .code:n = { \@@_color_select:nn { hanziboxtrancolor } {#1} } , trancolor .initial:n = black , trancolor* .code:n = { \@@_color_select:nnn { hanziboxtrancolor } #1 } , % \end{macrocode} % \end{macro} % % \begin{macro}{color} % åŒæ—¶è®¾ç½®è¾¹æ¡†ã€å—ç¬¦ã€æ‹¼éŸ³å’Œè¯‘文颜色 % \begin{macrocode} color .meta:n = { framecolor = #1, crosscolor = #1, charcolor = #1, pinyincolor = #1, trancolor = #1 } , color* .meta:n = { framecolor* = #1, crosscolor = #1, charcolor* = #1, pinyincolor* = #1, trancolor* = #1 } , % \end{macrocode} % \end{macro} % % \begin{macro}{fillcolor} % 填充色 % \begin{macrocode} fillcolor .code:n = { \exp_args:Nx \tl_if_empty:nTF {#1} { \@@_color_select:nn { hanziboxfillcolor } { white } \cs_set_nopar:Npn \@@_aux_color_fill: { } }{ \@@_color_select:nn { hanziboxfillcolor } {#1} \cs_set_nopar:Npn \@@_aux_color_fill: { \color_fill:n {#1} } } } , fillcolor* .code:n = { \@@_color_select:nnn { hanziboxfillcolor } #1 \cs_set_nopar:Npn \@@_aux_color_fill: { \color_fill:nn #1 } } , % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/08}{æ·»åŠ å—符轮廓类型charstroke选项} % % \begin{macro}{charstroke} % 设置汉å—轮廓类型 % \begin{macrocode} charstroke .choice:, charstroke .value_required:n = true, charstroke .choices:nn = { none, solid, dashed, invisible } { \int_set_eq:NN \l_@@_charstroke_type_int \l_keys_choice_int }, charstroke .initial:n = none, % \end{macrocode} % \end{macro} % % \begin{macro}{dashpattern} % è™šçº¿æ ·å¼ % \begin{macrocode} dashpattern .tl_set:N = \l_@@_dash_pattern_tl , dashpattern .initial:n = { } , % \end{macrocode} % \end{macro} % % \begin{macro}{framearc} % 矩形外框转角åŠå¾„ % \begin{macrocode} framearc .code:n = { \tl_set:Nn \l_@@_frame_arc_tl { {#1}{#1} } } , framearc* .tl_set:N = \l_@@_frame_arc_tl , framearc* .initial:n = { { 0cm }{ 0cm } } , % \end{macrocode} % \end{macro} % % \begin{macro}{debug} % DebugçŠ¶æ€ % \begin{macrocode} debug .bool_set:N = \l_@@_debug_bool , debug .initial:n = false , debug .default:n = true , % \end{macrocode} % \end{macro} % % \begin{macro}{autopinyin} % 是å¦é€šè¿‡æ±‰å—è‡ªåŠ¨èŽ·å–æ‹¼éŸ³ï¼Œé»˜è®¤ä¸ºtrue。 % \begin{macrocode} autopinyin .bool_set:N = \l_@@_autopinyin_bool, autopinyin .default:n = true, autopinyin .initial:n = true, % \end{macrocode} % \end{macro} % % \begin{macro}{initial} % 是å¦è¾“出声æ¯ï¼Œé»˜è®¤ä¸ºtrue。 % \begin{macrocode} initial .bool_set:N = \l_@@_withinitial_bool, initial .default:n = true, initial .initial:n = true, % \end{macrocode} % \end{macro} % % \begin{macro}{vowel} % 是å¦è¾“出韵æ¯ï¼Œé»˜è®¤ä¸ºtrue。 % \begin{macrocode} vowel .bool_set:N = \l_@@_withvowel_bool, vowel .default:n = true, vowel .initial:n = true, % \end{macrocode} % \end{macro} % % \begin{macro}{tone} % 是å¦è¾“出声调,默认为true。 % \begin{macrocode} tone .bool_set:N = \l_@@_withtone_bool, tone .default:n = true, tone .initial:n = true, % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{æ·»åŠ æ˜¯å¦æ˜¾ç¤ºæ‹¼éŸ³çº¿\opt{pinyinline}选项} % % \begin{macro}{pinyinline} % 是å¦ç»˜åˆ¶æ‹¼éŸ³å››çº¿æ ¼ï¼Œé»˜è®¤ä¸ºtrue。 % \begin{macrocode} pinyinline .bool_set:N = \l_@@_withpinyinlines_bool, pinyinline .default:n = true, pinyinline .initial:n = false, % \end{macrocode} % \end{macro} % % \changes{v1.1.0}{2021/09/21}{æ·»åŠ éšè—æ‹¼éŸ³ã€æ±‰å—和译文选项} % % \begin{macro}{pinyin} % æ˜¯å¦æ˜¾ç¤ºæ‹¼éŸ³ï¼Œé»˜è®¤ä¸ºtrue。 % \begin{macrocode} pinyin .bool_set:N = \l_@@_withpinyin_bool, pinyin .default:n = true, pinyin .initial:n = true, % \end{macrocode} % \end{macro} % % \begin{macro}{hanzi} % æ˜¯å¦æ˜¾ç¤ºæ±‰å—,默认为true。 % \begin{macrocode} hanzi .bool_set:N = \l_@@_withhanzi_bool, hanzi .default:n = true, hanzi .initial:n = true, % \end{macrocode} % \end{macro} % % \begin{macro}{tran} % æ˜¯å¦æ˜¾ç¤ºè¯‘文,默认为true。 % \begin{macrocode} tran .bool_set:N = \l_@@_withtran_bool, tran .default:n = true, tran .initial:n = true, % \end{macrocode} % \end{macro} % % \changes{v2.3.0}{2022/04/17}{æ·»åŠ ä½œæ–‡æ ¼å垂直间è·gridsepv选项} % % \begin{macro}{gridsepv} % ä½œæ–‡æ ¼ååž‚ç›´é—´è· % \begin{macrocode} gridsepv .tl_set:N = \l_@@_grid_sep_v_tl , gridsepv .initial:n = 4.0 , % \end{macrocode} % \end{macro} % % \changes{v2.3.0}{2022/04/17}{æ·»åŠ ä½œæ–‡æ ¼å列数gridcols选项} % % \begin{macro}{gridsepv} % ä½œæ–‡æ ¼åæ¯è¡Œåˆ—æ•° % \begin{macrocode} gridcols .int_set:N = \l_@@_grid_cols_int , gridcols .initial:n = 20 , % \end{macrocode} % \end{macro} % % å¤„ç†æœªçŸ¥é€‰é¡¹ã€‚ % \begin{macrocode} unknown .code:n = { \@@_error:n { unknown-option } } } \msg_new:nnn { hanzibox } { unknown-option } { package~ option~ "\l_keys_key_tl"~ is~ unknown. } % \end{macrocode} % % 傿•°é»˜è®¤å€¼ % \begin{macrocode} \keys_set:nn { hanzibox } { basechar = 好 , zihao = 4 , pinyinf = \tiny , charf = \normalsize , tranf = \tiny , frametype = none , resize = none , } % \end{macrocode} % % \subsection{选项用户接å£} % % \begin{macro}{\hanziboxset} % 选项设置用户接å£ã€‚ % \begin{macrocode} \NewDocumentCommand \hanziboxset { m } { \keys_set:nn { hanzibox } {#1} } % \end{macrocode} % \end{macro} % % \subsection{内部函数} % % \begin{macro}{\@@_dialog:nnnn} % 手动汉å—ç›’åæŽ’版命令。 % \begin{macrocode} \cs_new:Npn \@@_dialog:nnnn #1#2#3#4 { \group_begin: \keys_set:nn { hanzibox } { #1 } \tl_set:Nx \l_@@_character_tl {#2} \tl_set:Nx \l_@@_pinyin_tl {#3} \tl_set:Nx \l_@@_translation_tl {#4} \hcoffin_set:Nn \l_@@_str_box_coffin { \tl_map_inline:Nn \l_@@_character_tl { \@@_single_handle:N ##1 } } \hcoffin_set:Nn \l_tmpa_coffin { \hcoffin_set:Nn \l_@@_pinyin_box_coffin { \color_select:n { hanziboxpinyincolor } \tl_use:N \l_@@_pinyin_format_tl \tl_use:N \l_@@_pinyin_tl } \dim_set:Nn \l_tmpa_dim { \coffin_wd:N \l_@@_pinyin_box_coffin } \draw_begin: \draw_linewidth:n { \l_@@_frame_linewidth_dim } \color_stroke:n { hanziboxframecolor!50 } \draw_path_scope_begin: \@@_frame_type_c:n { pinyinlines } { 0 } { 0 } { \l_tmpa_dim } { \hanziboxheight } { 1.0 } { 1.0 } \draw_transform_shift:n {\l_tmpa_dim / 2.0, \l_@@_pinyin_height_i_dim } \draw_coffin_use:Nnn \l_@@_pinyin_box_coffin { hc } { H } \draw_path_scope_end: \draw_end: } \hcoffin_set:Nn \l_@@_tran_box_coffin { \tl_use:N \l_@@_translation_format_tl \tl_use:N \l_@@_translation_tl } \coffin_join:NnnNnnnn \l_tmpa_coffin { hc } { b } \l_@@_str_box_coffin { hc } { t } { 0pt } { \l_@@_frame_linewidth_dim } \coffin_join:NnnNnnnn \l_tmpa_coffin { hc } { b } \l_@@_tran_box_coffin { hc } { t } { 0pt } { -2pt } \coffin_set_eq:NN \l_@@_box_coffin \l_tmpa_coffin \@@_resize_c:n { \l_@@_resize_method_tl } \coffin_typeset:Nnnnn \l_@@_box_coffin { l } { b } { 0pt } { 0pt } \allowbreak \group_end: } % \end{macrocode} % \end{macro} % % \changes{v2.0.1}{2021/09/28}{分离多å—ã€å•å—ã€0个å—çš„ç›’åæž„é€ ä»£ç } % \changes{v2.1.0}{2021/09/30}{æ›´æ–°æ‹¼éŸ³èŽ·å–æ–¹å¼} % \changes{v2.2.0}{2021/10/09}{åˆ†ç¦»æ±‰å—æ‹¼éŸ³coffinæž„é€ å‡½æ•°} % % \begin{macro}{\@@_single_pinyin_hanzi_construct:NN} % æž„é€ å•个拼音+汉å—coffin。 % \begin{macrocode} \cs_new:Npn \@@_single_pinyin_hanzi_construct:NN #1#2 { \tl_if_empty:NTF #1 { \hcoffin_set:Nn \l_tmpa_coffin { \@@_single_handle:N \c_@@_basechar_tl } } { \hcoffin_set:Nn \l_tmpa_coffin { \@@_single_handle:N #1 } } \tl_if_empty:NTF #2 { \hcoffin_set:Nn \l_@@_pinyin_hanzi_coffin { \@@_single_pinyin_lines: } \coffin_join:NnnNnnnn \l_@@_pinyin_hanzi_coffin { hc } { b } \l_tmpa_coffin { hc } { t } { 0pt } { \l_@@_pinyin_linewidth_dim } } { \bool_if:NTF \l_@@_withpinyin_bool { \hcoffin_set:Nn \l_@@_pinyin_hanzi_coffin { \@@_single_pinyin:V #2 } \coffin_join:NnnNnnnn \l_@@_pinyin_hanzi_coffin { hc } { b } \l_tmpa_coffin { hc } { t } { 0pt } { \l_@@_pinyin_linewidth_dim } } { \coffin_set_eq:NN \l_@@_pinyin_hanzi_coffin \l_tmpa_coffin } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_multi_str_coffin_construct:} % æž„é€ å¤šæ±‰å—带拼音å—符串盒å。 % \begin{macrocode} \cs_new:Npn \@@_multi_str_coffin_construct: { \hcoffin_set:Nn \l_@@_str_box_coffin { } \bool_if:NTF \l_@@_autopinyin_bool { \tl_map_inline:Nn \l_@@_character_tl { \@@_get_hanzi_pinyin:n { ##1 } \@@_single_pinyin_hanzi_construct:NN ##1 \l_@@_hanzi_pinyin_tl \coffin_join:NnnNnnnn \l_@@_str_box_coffin { r } { b } \l_@@_pinyin_hanzi_coffin { l } { b } { -\l_@@_frame_linewidth_dim } { 0pt } } } { \@@_get_tone_pinyin:V \l_@@_pinyin_tl \clist_clear:N \l_@@_tone_pinyin_clist \clist_set:NV \l_@@_tone_pinyin_clist \l_@@_tone_pinyin_tl \int_set:Nn \l_tmpa_int {\clist_count:N \l_@@_tone_pinyin_clist} \int_compare:nNnTF { \l_@@_character_int } = { \l_tmpa_int } { \tl_map_inline:Nn \l_@@_character_tl { \clist_pop:NN \l_@@_tone_pinyin_clist \l_tmpb_tl \@@_single_pinyin_hanzi_construct:NN ##1 \l_tmpb_tl \coffin_join:NnnNnnnn \l_@@_str_box_coffin { r } { b } \l_@@_pinyin_hanzi_coffin { l } { b } { -\l_@@_frame_linewidth_dim } { 0pt } } } { \int_compare:nNnTF { \l_@@_character_int } > { \l_tmpa_int } { \int_step_inline:nn { \l_tmpa_int } { \tl_set:Nx \l_tmpa_tl {\tl_item:Nn \l_@@_character_tl { ##1 }} \clist_pop:NN \l_@@_tone_pinyin_clist \l_tmpb_tl \@@_single_pinyin_hanzi_construct:NN \l_tmpa_tl \l_tmpb_tl \coffin_join:NnnNnnnn \l_@@_str_box_coffin { r } { b } \l_@@_pinyin_hanzi_coffin { l } { b } { -\l_@@_frame_linewidth_dim } { 0pt } } \int_step_inline:nnn { \l_tmpa_int + 1 } { \l_@@_character_int } { \tl_set:Nx \l_tmpa_tl {\tl_item:Nn \l_@@_character_tl { ##1 }} \tl_clear:N \l_tmpb_tl \@@_single_pinyin_hanzi_construct:NN \l_tmpa_tl \l_tmpb_tl \coffin_join:NnnNnnnn \l_@@_str_box_coffin { r } { b } \l_@@_pinyin_hanzi_coffin { l } { b } { -\l_@@_frame_linewidth_dim } { 0pt } } } { \int_step_inline:nn { \l_@@_character_int } { \tl_set:Nx \l_tmpa_tl {\tl_item:Nn \l_@@_character_tl { ##1 }} \clist_pop:NN \l_@@_tone_pinyin_clist \l_tmpb_tl \@@_single_pinyin_hanzi_construct:NN \l_tmpa_tl \l_tmpb_tl \coffin_join:NnnNnnnn \l_@@_str_box_coffin { r } { b } \l_@@_pinyin_hanzi_coffin { l } { b } { -\l_@@_frame_linewidth_dim } { 0pt } } \bool_set_eq:NN \l_tmpa_bool \l_@@_withhanzi_bool \bool_set_false:N \l_@@_withhanzi_bool \int_step_inline:nnn { \l_@@_character_int + 1 } { \l_tmpa_int } { \tl_clear:N \l_tmpa_tl \clist_pop:NN \l_@@_tone_pinyin_clist \l_tmpb_tl \@@_single_pinyin_hanzi_construct:NN \l_tmpa_tl \l_tmpb_tl \coffin_join:NnnNnnnn \l_@@_str_box_coffin { r } { b } \l_@@_pinyin_hanzi_coffin { l } { b } { -\l_@@_frame_linewidth_dim } { 0pt } } \bool_set_eq:NN \l_@@_withhanzi_bool \l_tmpa_bool } } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_single_str_coffin_construct:} % æž„é€ å•个汉å—带拼音å—符串盒å。 % \begin{macrocode} \cs_new:Npn \@@_single_str_coffin_construct: { \bool_if:NTF \l_@@_autopinyin_bool { \hcoffin_set:Nn \l_@@_str_box_coffin { \@@_get_hanzi_pinyin:V \l_@@_character_tl \@@_single_pinyin_hanzi_construct:NN \l_@@_character_tl \l_@@_hanzi_pinyin_tl \coffin_typeset:Nnnnn \l_@@_pinyin_hanzi_coffin { l } { b } { 0pt } { 0pt } } } { \hcoffin_set:Nn \l_@@_str_box_coffin { \@@_get_tone_pinyin:V \l_@@_pinyin_tl \clist_clear:N \l_@@_tone_pinyin_clist \clist_set:NV \l_@@_tone_pinyin_clist \l_@@_tone_pinyin_tl \tl_set:Nx \l_tmpb_tl { \clist_use:Nn \l_@@_tone_pinyin_clist { } } \@@_single_pinyin_hanzi_construct:NN \l_@@_character_tl \l_tmpb_tl \coffin_typeset:Nnnnn \l_@@_pinyin_hanzi_coffin { l } { b } { 0pt } { 0pt } } } } % \end{macrocode} % \end{macro} % % \changes{v2.1.1}{2021/10/02}{ä¿®å¤æ— æ±‰å—æ‰‹åŠ¨æ‹¼éŸ³åˆ†å‰²é—®é¢˜} % % \begin{macro}{\@@_null_str_coffin_construct:} % æž„é€ ç©ºç™½æ±‰å—(0个汉å—)带拼音å—符串盒å。 % \begin{macrocode} \cs_new:Npn \@@_null_str_coffin_construct: { \bool_set_eq:NN \l_tmpa_bool \l_@@_withhanzi_bool \bool_set_false:N \l_@@_withhanzi_bool \bool_if:NTF \l_@@_autopinyin_bool { \hcoffin_set:Nn \l_@@_str_box_coffin { \@@_single_handle:N \c_@@_basechar_tl } } { \hcoffin_set:Nn \l_@@_str_box_coffin { } \bool_if:NTF \l_@@_withpinyin_bool { \@@_get_tone_pinyin:V \l_@@_pinyin_tl \clist_clear:N \l_@@_tone_pinyin_clist \clist_set:NV \l_@@_tone_pinyin_clist \l_@@_tone_pinyin_tl \int_set:Nn \l_tmpa_int {\clist_count:N \l_@@_tone_pinyin_clist} \int_step_inline:nn { \l_tmpa_int } { \tl_clear:N \l_tmpa_tl \clist_pop:NN \l_@@_tone_pinyin_clist \l_tmpb_tl \@@_single_pinyin_hanzi_construct:NN \l_tmpa_tl \l_tmpb_tl \coffin_join:NnnNnnnn \l_@@_str_box_coffin { r } { b } \l_@@_pinyin_hanzi_coffin { l } { b } { -\l_@@_frame_linewidth_dim } { 0pt } } } { \bool_set_false:N \l_@@_withhanzi_bool \@@_single_handle:N \c_@@_basechar_tl } } \bool_set_eq:NN \l_@@_withhanzi_bool \l_tmpa_bool } % \end{macrocode} % \end{macro} % % \changes{v2.0.0}{2021/09/28}{将拼音处ç†è°ƒæ•´ä¸ºåœ¨handle函数ä¸ç›´æŽ¥å®žçް} % \changes{v2.0.0}{2021/09/28}{区分了å•个汉å—和空白汉å—的处ç†} % \changes{v2.0.1}{2021/09/29}{将汉å—ç›’å处ç†è¿‡ç¨‹æ‹†è§£ä¸ºå‡½æ•°å®žçް} % % \begin{macro}{\@@_handle:nnnn} % æž„é€ æ±‰å—ç›’åå…¥å£ % \begin{macrocode} \cs_new:Npn \@@_handle:nnnn #1#2#3#4 { \group_begin: \keys_set:nn { hanzibox } { #1 } \tl_gset:Nx \l_@@_character_tl {#2} \tl_gset:Nx \l_@@_pinyin_tl {#3} \tl_gset:Nx \l_@@_translation_tl {#4} \int_set:Nn \l_@@_character_int { \tl_count:V \l_@@_character_tl } \int_set:Nn \l_@@_translation_int { \tl_count:V \l_@@_translation_tl } \int_set:Nn \l_@@_pinyin_int { \tl_count:V \l_@@_pinyin_tl } \int_compare:nNnTF { \l_@@_character_int } > { 1 } { \@@_multi_str_coffin_construct: } { \int_compare:nNnTF { \l_@@_character_int } = { 1 } { \@@_single_str_coffin_construct: } { \@@_null_str_coffin_construct: } } \bool_if:NT \l_@@_withtran_bool { \hcoffin_set:Nn \l_@@_tran_box_coffin { \color_select:n { hanziboxtrancolor } \tl_use:N \l_@@_translation_format_tl \tl_use:N \l_@@_translation_tl } } \coffin_join:NnnNnnnn \l_@@_str_box_coffin { hc } { b } \l_@@_tran_box_coffin { hc } { t } { 0pt } { -3pt } \coffin_set_eq:NN \l_@@_box_coffin \l_@@_str_box_coffin \@@_resize_c:n { \l_@@_resize_method_tl } \coffin_typeset:Nnnnn \l_@@_box_coffin { l } { b } { 0pt } { 0pt } \allowbreak \group_end: } % \end{macrocode} % \end{macro} % % \changes{v2.3.0}{2022/04/17}{æ·»åŠ ä½œæ–‡æ ¼å内部命令。} % % \begin{macro}{\@@_writegrid:nnn} % æž„é€ ä½œæ–‡æ ¼åå…¥å£ % \begin{macrocode} \cs_new:Npn \@@_writegrid:nn #1#2 { \group_begin: \keys_set:nn { hanzibox } { #1 } \tl_if_eq:NnT \l_@@_frame_type_tl { none } { \tl_set:Nn \l_@@_frame_type_tl { å£ } } \hcoffin_set:Nn \l_@@_grid_tmpa_coffin { \draw_begin: \draw_linewidth:n { \l_@@_frame_linewidth_dim } \@@_aux_color_fill: \color_stroke:n { hanziboxframecolor } \draw_path_scope_begin: \@@_frame_type_c:n { \l_@@_frame_type_tl } { 0 } { 0 } { \hanziboxwidth } { \hanziboxheight } { 1.0 } { 1.0 } \int_decr:N \l_@@_grid_cols_int \int_step_inline:nn { \l_@@_grid_cols_int } { \draw_transform_shift:n {\hanziboxwidth, 0.0 } \@@_frame_type_c:n { \l_@@_frame_type_tl } { 0 } { 0 } { \hanziboxwidth } { \hanziboxheight } { 1.0 } { 1.0 } } \draw_path_scope_end: \draw_end: } \hcoffin_set:Nn \l_@@_grid_tmpb_coffin { \coffin_typeset:Nnnnn \l_@@_grid_tmpa_coffin { l } { b } { 0pt } { 0pt } } \int_step_inline:nn { #2 - 1 } { \coffin_join:NnnNnnnn \l_@@_grid_tmpb_coffin { hc } { b } \l_@@_grid_tmpa_coffin { hc } { t } { 0pt } { -\hanziboxheight * \dim_ratio:nn { 1 pt }{ \l_@@_grid_sep_v_tl pt } } } \dim_set:Nn \l_tmpa_dim { \coffin_wd:N \l_@@_grid_tmpb_coffin } \dim_set:Nn \l_tmpb_dim { \tex_dimexpr:D \coffin_ht:N \l_@@_grid_tmpb_coffin + \coffin_dp:N \l_@@_grid_tmpb_coffin \scan_stop: } \draw_begin: \draw_linewidth:n { \l_@@_frame_linewidth_dim * 4 } \@@_aux_color_fill: \color_stroke:n { hanziboxframecolor } \draw_path_scope_begin: \draw_path_rectangle_corners:nn { 0cm , 0cm } { \l_tmpa_dim, \l_tmpb_dim } \draw_path_use_clear:n { draw } \draw_transform_shift:n {\l_tmpa_dim / 2.0, \l_tmpb_dim / 2.0 } \draw_coffin_use:Nnn \l_@@_grid_tmpb_coffin { hc } { vc } \draw_path_scope_end: \draw_end: \group_end: } % \end{macrocode} % \end{macro} % % \changes{v2.0.0}{2021/09/27}{å¯¹äºŽæ— éœ€åˆ†è§£å£°éŸµæ¯çš„æƒ…况, % 直接使用xpinyinå®åŒ…的结果排版拼音。} % % \begin{macro}{\@@_single_pinyin:n} % æž„é€ å•个汉å—的拼音盒å % \begin{macrocode} \cs_new:Npn \@@_single_pinyin:n #1 { \bool_if:NTF \l_@@_withtone_bool { \bool_if:nTF { !(\l_@@_withinitial_bool) || !(\l_@@_withvowel_bool) } { \@@_split_pinyin_withtone:n { #1 } \hcoffin_set:Nn \l_@@_pinyin_box_coffin { \color_select:n { hanziboxpinyincolor } \tl_use:N \l_@@_pinyin_format_tl \bool_if:NTF \l_@@_withinitial_bool { \bool_if:NTF \l_@@_withvowel_bool { \tl_use:N \l_@@_initial_tl \tl_use:N \l_@@_vowel_tl } { \tl_use:N \l_@@_initial_tl \phantom{ \tl_use:N \l_@@_vowel_tl } } } { \bool_if:NTF \l_@@_withvowel_bool { \phantom{ \tl_use:N \l_@@_initial_tl } \tl_use:N \l_@@_vowel_tl } { \phantom{ \tl_use:N \l_@@_initial_tl } \phantom{ \tl_use:N \l_@@_vowel_tl } } } } } { \hcoffin_set:Nn \l_@@_pinyin_box_coffin { \color_select:n { hanziboxpinyincolor } \tl_use:N \l_@@_pinyin_format_tl #1 } } } { \@@_split_pinyin_withouttone:n { #1 } \hcoffin_set:Nn \l_@@_pinyin_box_coffin { \color_select:n { hanziboxtrancolor } \tl_use:N \l_@@_pinyin_format_tl \tl_use:N \l_@@_pinyin_tl } } \@@_single_pinyin_lines_construct: } \cs_generate_variant:Nn \@@_single_pinyin:n { V } \cs_generate_variant:Nn \@@_single_pinyin:n { x } \cs_set:Npn \@@_single_pinyin_o:n { \exp_after:wN \@@_single_pinyin:n } \cs_set:Npn \@@_single_pinyin_f:n { \exp_args:Nf \@@_single_pinyin:n } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_single_handle:nN,\@@_single_handle:N} % æž„é€ å•个汉å—ç›’åå…¥å£ % \begin{macrocode} \cs_new:Npn \@@_single_handle:nN #1#2 { \group_begin: \tl_if_empty:nF {#1} { \keys_set:nn { hanzibox } {#1} } \tl_set:Nf \l_@@_curr_char_tl {#2} \@@_single_construct_o:N \l_@@_curr_char_tl \group_end: } \cs_new:Npn \@@_single_handle:N #1 { \group_begin: \tl_set:Nf \l_@@_curr_char_tl {#1} \@@_single_construct_o:N \l_@@_curr_char_tl \group_end: } % \end{macrocode} % \end{macro} % % \changes{v2.0.0}{2021/09/27}{åˆ é™¤å•ä¸ªæ±‰å—æž„é€ ä¸æ·»åŠ æ‹¼éŸ³çš„åŠŸèƒ½} % \changes{v2.2.0}{2021/10/08}{ä¸ºæ±‰å—æ·»åŠ å—符轮廓处ç†} % % \begin{macro}{\@@_single_construct:N} % æž„é€ å•个汉å—ç›’å % \begin{macrocode} \cs_new:Npn \@@_single_construct:N #1 { \bool_if:NTF \l_@@_withhanzi_bool { \hcoffin_set:Nn \l_@@_box_coffin { \color_select:n { hanziboxcharcolor } \tl_use:N \l_@@_character_format_tl \@@_chars_stroke_construct:n { #1 } } } { \hcoffin_set:Nn \l_@@_box_coffin { \color_select:n { hanziboxcharcolor } \tl_use:N \l_@@_character_format_tl \phantom{#1} } } \@@_single_frame_construct: } \cs_set:Npn \@@_single_construct_o:N { \exp_after:wN \@@_single_construct:N } \cs_set:Npn \@@_single_construct_f:N { \exp_args:Nf \@@_single_construct:N } % \end{macrocode} % \end{macro} % % \changes{v2.0.0}{2021/09/28}{将汉å—ç›’å与边框按ä¸å¿ƒå¯¹é½ï¼Œä»¥ä½¿æ±‰å—å±…ä¸} % % \begin{macro}{\@@_single_frame_construct:} % æž„é€ å•个汉å—ç›’å边框 % \begin{macrocode} \cs_new:Npn \@@_single_frame_construct: { \draw_begin: \draw_linewidth:n { \l_@@_frame_linewidth_dim } \@@_aux_color_fill: \color_stroke:n { hanziboxframecolor } \exp_after:wN \draw_path_corner_arc:nn \l_@@_frame_arc_tl \draw_path_scope_begin: \@@_frame_type_c:n { \l_@@_frame_type_tl } { 0 } { 0 } { \hanziboxwidth } { \hanziboxheight } { 1.0 } { 1.0 } \draw_transform_shift:n {\hanziboxwidth / 2.0, \hanziboxheight / 2.0 } \draw_coffin_use:Nnn \l_@@_box_coffin { hc } { vc } \draw_path_scope_end: \draw_end: } % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{æ·»åŠ æž„é€ å•个拼音盒å函数} % % \begin{macro}{\@@_single_pinyin_lines_construct:} % æž„é€ å•个拼音盒å % \begin{macrocode} \cs_new:Npn \@@_single_pinyin_lines_construct: { \draw_begin: \draw_linewidth:n { \l_@@_pinyin_linewidth_dim } \color_stroke:n { hanziboxframecolor!50 } \draw_path_scope_begin: \@@_frame_type_c:n { pinyinlines } { 0 } { 0 } { \hanziboxwidth } { \hanziboxheight } { 1.0 } { 1.0 } \draw_transform_shift:n {\hanziboxwidth / 2.0, \l_@@_pinyin_height_i_dim } \draw_coffin_use:Nnn \l_@@_pinyin_box_coffin { hc } { H } \draw_path_scope_end: \draw_end: } % \end{macrocode} % \end{macro} % % \changes{v2.2.0}{2021/10/07}{æ·»åŠ æž„é€ å•个拼音线函数} % % \begin{macro}{\@@_single_pinyin_lines:} % æž„é€ å•个拼音线 % \begin{macrocode} \cs_new:Npn \@@_single_pinyin_lines: { \draw_begin: \draw_linewidth:n { \l_@@_pinyin_linewidth_dim } \color_stroke:n { hanziboxframecolor!50 } \@@_frame_type_c:n { pinyinlines } { 0 } { 0 } { \hanziboxwidth } { \hanziboxheight } { 1.0 } { 1.0 } \draw_end: } % \end{macrocode} % \end{macro} % % \subsection{\pkg{xpinyin}å®åŒ…拼音åŽå¤„ç†å‡½æ•°} % % \changes{v2.1.0}{2021/09/30}{æ·»åŠ ä»Žxpinyinå®åŒ…䏿喿‹¼éŸ³ä¸²å‡½æ•°ã€‚} % 摘录自LaTeX工作室问ç”:如何得到xpinyin拼音å®åŒ…得到的拼音文本? % (\url{https://ask.latexstudio.net/ask/question/3768.html}) % % å˜é‡å®šä¹‰ % \begin{macrocode} \tl_new:N \l_@@_save_tl \tl_new:N \l_@@_hanzi_pinyin_tl \tl_new:N \l_@@_tone_pinyin_tl % \end{macrocode} % % æž„é€ å£°è°ƒè¡¨ % \begin{macrocode} \clist_const:Nn \c_@@_tone_a_clist { Ä,á,ÇŽ,à ,a } \clist_const:Nn \c_@@_tone_o_clist { Å,ó,Ç’,ò,o } \clist_const:Nn \c_@@_tone_e_clist { Ä“,é,Ä›,è,e } \clist_const:Nn \c_@@_tone_u_clist { Å«,ú,Ç”,ù,u } \clist_const:Nn \c_@@_tone_i_clist { Ä«,Ã,Ç,ì,i } \clist_const:Nn \c_@@_tone_v_clist { Ç–,ǘ,Çš,Çœ,ü } % \end{macrocode} % % \begin{macro}{\@@_pinyin_aux:n} % 拼音生æˆè¾…助函数(改自xpinyinå®åŒ…çš„\verb!\__xpinyin_pinyin_aux:n #1!函数) % \begin{macrocode} \cs_new_protected:Npn \@@_pinyin_aux:n #1 { \quark_if_recursion_tail_stop_do:nn {#1} { \bool_if:NT \l__xpinyin_first_bool { \tl_set:NV \l_@@_tone_pinyin_tl \l__xpinyin_item_tl } } \__xpinyin_if_number:nTF {#1} { \bool_if:NT \l__xpinyin_first_bool { \bool_set_false:N \l__xpinyin_first_bool } \tl_put_right:NV \l_@@_tone_pinyin_tl \l__xpinyin_pre_tl \tl_put_right:Nx \l_@@_tone_pinyin_tl { \clist_item:cn { c_@@_tone_ \l__xpinyin_tone_tl _clist } {#1} } \tl_put_right:NV \l_@@_tone_pinyin_tl \l__xpinyin_post_tl \bool_if:NF \l_@@_autopinyin_bool { \tl_put_right:Nn \l_@@_tone_pinyin_tl {,} } \__xpinyin_pinyin_init: } { \int_compare:nNnTF { 0 \cs_if_exist_use:c { c__xpinyin_ \tl_to_str:N \l__xpinyin_tone_tl _tl } } > { 0 \cs_if_exist_use:c { c__xpinyin_ \tl_to_str:n {#1} _tl } } { \tl_put_right:Nn \l__xpinyin_post_tl {#1} } { \tl_set:Nn \l__xpinyin_tone_tl {#1} \tl_set_eq:NN \l__xpinyin_pre_tl \l__xpinyin_item_tl \tl_clear:N \l__xpinyin_post_tl } \tl_put_right:Nx \l__xpinyin_item_tl { \__xpinyin_replace_v:n {#1} } } \@@_pinyin_aux:n } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_get_tone_pinyin:n} % æ ¹æ®æ‰‹åŠ¨æ‹¼éŸ³å¾—åˆ°æ‹¼éŸ³ % \begin{macrocode} \cs_new:Npn \@@_get_tone_pinyin:n #1 { \tl_clear:N \l_@@_tone_pinyin_tl \__xpinyin_pinyin_init: \tl_set:Nn \l_@@_save_tl {#1} \bool_set_true:N \l__xpinyin_first_bool \@@_pinyin_aux:n #1 \q_recursion_tail \q_recursion_stop } \cs_generate_variant:Nn \@@_get_tone_pinyin:n { V } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_get_hanzi_pinyin:n} % 自动拼音 % \begin{macrocode} \cs_new:Npn \@@_get_hanzi_pinyin:n #1 { \tl_set_eq:Nc \l_tmpa_tl { c__xpinyin_ \__xpinyin_char_to_unicode:n {#1} _tl } \exp_args:No \tl_if_head_eq_meaning:nNTF { \l_tmpa_tl } \__xpinyin_pinyin:n { \exp_args:Nf \@@_get_tone_pinyin:n { \exp_after:wN \use_ii:nn \l_tmpa_tl } \tl_set_eq:NN \l_@@_hanzi_pinyin_tl \l_@@_tone_pinyin_tl } { \tl_set_eq:NN \l_@@_hanzi_pinyin_tl \l_tmpa_tl } } \cs_generate_variant:Nn \@@_get_hanzi_pinyin:n { V } % \end{macrocode} % \end{macro} % % \changes{v2.0.0}{2021/09/24}{æ·»åŠ ä»Žxpinyinå®åŒ…䏿喿‹¼éŸ³å‡½æ•°ã€‚} % ä»£ç æ‘˜å½•自LaTeX工作室:基于xpinyinå®åŒ…èŽ·å–æ±‰å—的声æ¯ï¼ŒéŸµæ¯ï¼Œå£°è°ƒ % (\url{https://www.latexstudio.net/index/details/index/mid/1994.html}) % % 从需è¦çš„声æ¯ã€éŸµæ¯ã€è¯»éŸ³è¡¨ã€‚ % % 声æ¯è¡¨ % \begin{macrocode} \clist_set:Nn \l_@@_initials_clist { {zh} , {ch} , {sh} , {b} , {p} , {m} , {f} , {d} , {t} , {l} , {k} , {h} , {j} , {q} , {x} , {r} , {z} , {c} , {s} , {y} , {w} , {g} , {n} } % \end{macrocode} % % \changes{v2.0.0}{2021/09/27}{修订部分错误带音调韵æ¯è¡¨} % % 带声音调韵æ¯è¡¨ % \begin{macrocode} \clist_set:Nn \l_@@_vowel_tone_clist { {iÄng} , {iáng} , {iÇŽng} , {ià ng} , {iang} , {iÅng} , {ióng} , {iÇ’ng} , {iòng} , {iong} , {uÄng} , {uáng} , {uÇŽng} , {uà ng} , {uang} , {uÄ“ng} , {uéng} , {uÄ›ng} , {uèng} , {ueng} , {Äng} , {áng} , {ÇŽng} , {à ng} , {ang} , {Ä“ng} , {éng} , {Ä›ng} , {èng} , {eng} , {Ä«ng} , {Ãng} , {Çng} , {ìng} , {ing} , {Ång} , {óng} , {Ç’ng} , {òng} , {ong} , {uÄi} , {uái} , {uÇŽi} , {uà i} , {uai} , {uÄn} , {uán} , {uÇŽn} , {uà n} , {uan} , {uÄ“i} , {uéi} , {uÄ›i} , {uèi} , {uei} , {uÄo} , {uáo} , {uÇŽo} , {uà o} , {uao} , {iÅu} , {ióu} , {iÇ’u} , {iòu} , {iou} , {iÄn} , {ián} , {iÇŽn} , {ià n} , {ian} , {üÄn} , {üán} , {üǎn} , {üà n} , {üan} , {uÄ“n} , {uén} , {uÄ›n} , {uèn} , {uen} , {Äi} , {ái} , {ÇŽi} , {à i} , {ai} , {Ä“i} , {éi} , {Ä›i} , {èi} , {ei} , {uÄ} , {uá} , {uÇŽ} , {uà } , {ua} , {uÅ} , {uó} , {uÇ’} , {uò} , {uo} , {uÄ«} , {uÃ} , {uÇ} , {uì} , {ui} , {Äo} , {áo} , {ÇŽo} , {à o} , {ao} , {Åu} , {óu} , {Ç’u} , {òu} , {ou} , {iÅ«} , {iú} , {iÇ”} , {iù} , {iu} , {iÄ} , {iá} , {iÇŽ} , {ià } , {ia} , {iÄ“} , {ié} , {iÄ›} , {iè} , {ie} , {uÄ“} , {ué} , {uÄ›} , {uè} , {ue} , {üē} , {üé} , {üě} , {üè} , {üe} , {Ä“r} , {ér} , {Ä›r} , {èr} , {er} , {Än} , {án} , {ÇŽn} , {à n} , {an} , {Ä“n} , {én} , {Ä›n} , {èn} , {en} , {Ä«n} , {Ãn} , {Çn} , {ìn} , {in} , {Å«n} , {ún} , {Ç”n} , {ùn} , {un} , {Ç–n} , {ǘn} , {Çšn} , {Çœn} , {ün} , {Ä} , {á} , {ÇŽ} , {à } , {a} , {Ä“} , {é} , {Ä›} , {è} , {e} , {Ä«} , {Ã} , {Ç} , {ì} , {i} , {Å} , {ó} , {Ç’} , {ò} , {o} , {Å«} , {ú} , {Ç”} , {ù} , {u} , {Ç–} , {ǘ} , {Çš} , {Çœ} , {ü} } % \end{macrocode} % % 韵æ¯è¡¨ % \begin{macrocode} \clist_set:Nn \l_@@_vowel_clist { {iang} , {iong} , {uang} , {ueng} , {ang} , {eng} , {ing} , {ong} , {uai} , {uan} , {uai} , {uei} , {iao} , {iou} , {ian} , {üan} , {uen} , {ai} , {ei} , {ua} , {uo} , {ui} , {ao} , {ou} , {iu} , {ie} , {üe} , {er} , {an} , {en} , {in} , {un} , {ün} , {a} , {e} , {i} , {o} , {ü} , {u} } % \end{macrocode} % % 声调表 % \begin{macrocode} \clist_set:Nn \l_@@_tone_num_clist { {Ä} {a1} , {á} {a2} , {ÇŽ} {a3} , {à } {a4} , {Å} {o1} , {ó} {o2} , {Ç’} {o3} , {ò} {o4} , {Ä“} {e1} , {é} {e2} , {Ä›} {e3} , {è} {e4} , {Å«} {u1} , {ú} {u2} , {Ç”} {u3} , {ù} {u4} , {ḿ} {m2} , {Å„} {n2} , {ň} {n3} , {ǹ} {n4} , {Ä«} {i1} , {Ã} {i2} , {Ç} {i3} , {ì} {i4} , {Ç–} {v1} , {ǘ} {v2} , {Çš} {v3} , {Çœ} {v4} } % \end{macrocode} % % 去声调表 % \begin{macrocode} \clist_set:Nn \l_@@_nonetone_clist { {Ä} {a} , {á} {a} , {ÇŽ} {a} , {à } {a} , {Å} {o} , {ó} {o} , {Ç’} {o} , {ò} {o} , {Ä“} {e} , {é} {e} , {Ä›} {e} , {è} {e} , {Å«} {u} , {ú} {u} , {Ç”} {u} , {ù} {u} , {ḿ} {m} , {Å„} {n} , {ň} {n} , {ǹ} {n} , {Ä«} {i} , {Ã} {i} , {Ç} {i} , {ì} {i} , {Ç–} {ü} , {ǘ} {ü} , {Çš} {ü} , {Çœ} {ü} } % \end{macrocode} % % \begin{macro}{\@@_split_pinyin_withtone:n} % 分离拼音ä¸çš„声æ¯å’Œå¸¦å£°è°ƒçš„韵æ¯ã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_split_pinyin_withtone:n #1 { \int_zero:N \l_@@_tone_int \str_clear:N \l_@@_pinyin_str \tl_clear:N \l_@@_pinyin_tl \tl_clear:N \l_@@_initial_tl \tl_clear:N \l_@@_vowel_tl \tl_set:Nn \l_@@_pinyin_tl {#1} \tl_map_inline:Nn \l_@@_pinyin_tl { \str_put_right:Nn \l_@@_pinyin_str {##1} } \clist_map_inline:Nn \l_@@_initials_clist { \str_if_in:NnT { \l_@@_pinyin_str } {##1} { \tl_set:Nn \l_@@_initial_tl {##1} \clist_map_break: } } \clist_map_inline:Nn \l_@@_vowel_tone_clist { \str_if_in:NnT { \l_@@_pinyin_str } { ##1 } { \tl_set:Nn \l_@@_vowel_tl {##1} \clist_map_break: } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_split_pinyin_withouttone:n} % 分离拼音ä¸çš„声æ¯å’Œä¸å¸¦å£°è°ƒçš„韵æ¯ã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_split_pinyin_withouttone:n #1 { \int_zero:N \l_@@_tone_int \str_clear:N \l_@@_pinyin_str \tl_clear:N \l_@@_pinyin_tl \tl_clear:N \l_@@_initial_tl \tl_clear:N \l_@@_vowel_tl \tl_set:Nn \l_@@_pinyin_tl {#1} \clist_map_inline:Nn \l_@@_nonetone_clist { \tl_replace_all:Nnn \l_@@_pinyin_tl ##1 } \tl_map_inline:Nn \l_@@_pinyin_tl { \str_put_right:Nn \l_@@_pinyin_str {##1} } \clist_map_inline:Nn \l_@@_initials_clist { \str_if_in:NnT {\l_@@_pinyin_str} {##1} { \tl_set:Nn \l_@@_initial_tl {##1} \clist_map_break: } } \clist_map_inline:Nn \l_@@_vowel_clist { \str_if_in:NnT { \l_@@_pinyin_str } { ##1 } { \tl_set:Nn \l_@@_vowel_tl {##1} \clist_map_break: } } } % \end{macrocode} % \end{macro} % % \begin{macrocode} %</package> % \end{macrocode} % % \end{implementation} % % \Finale % \endinput