% \iffalse meta-comment % % Copyright (C) 2017--2023 by Xiangdong Zeng <xdzeng96@gmail.com> % % 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. 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 Xiangdong Zeng. % % \fi % % \EnableImplementation % % \begin{implementation} % %^^A 代ç éƒ¨åˆ†çš„é¡µè¾¹è· % \newgeometry{ % left = 2.25 in, % right = 1.00 in, % top = 1.25 in, % bottom = 1.00 in, % marginpar = 2.25 in % } % % \subsection{æ¨¡æ¿æ–‡æ¡£æ ·å¼ \cls{fdudoc}} % % \changes{v0.4}{2017/07/29}{在 \cls{ctxdoc} çš„åŸºç¡€ä¸Šå®Œæˆ \cls{fdudoc} 文档类, % ç”¨äºŽæ¨¡æ¿æ‰‹å†Œçš„编写。} % % 编写 \LaTeX{} å®åŒ…æ–‡æ¡£ï¼Œä¼ ç»Ÿä¸Šä¼šé‡‡ç”¨ \pkg{doc} å®åŒ…或 % \cls{ltxdoc} 文档类。而对于使用 \LaTeX3 å¼€å‘çš„å®åŒ…,\cls{l3doc} % 文档类将是一个更好的选择。\CTeX{} å®é›†æ‰€é™„带的 % \href{https://github.com/CTeX-org/ctex-kit/blob/main/tool/ctxdoc.cls}^^A % {\cls{ctxdoc}} 文档类,则在 \cls{l3doc} 的基础上进行了一些修æ£ï¼Œ % ç‰¹åˆ«æ˜¯é‡æ–°å®žçŽ°äº† \env{macrocode} çŽ¯å¢ƒï¼Œä½¿ä¹‹èƒ½æ›´å¥½åœ°åº”ç”¨äºŽä¸æ–‡ % 文档。\cls{ctxdoc} 的主è¦åŠŸèƒ½å¦‚ä¸‹ï¼š % % \begin{itemize} % \item 注释使用ç°è‰²ã€å€¾æ–œå—体,以便与一般代ç 区分; % \item 模å—ã€åå—空间ç‰ä½¿ç”¨å½©è‰²æ ‡æ³¨ï¼Œå¹¶æ·»åŠ è¶…é“¾æŽ¥ï¼› % \item 自动更新行å·å®½åº¦ï¼› % \item 边注ä¸çš„长命令使用盒åè¿›è¡Œç¼©æ”¾ï¼Œé˜²æ¢æº¢å‡ºï¼› % \item 修订记录ä¸å°†æ˜¾ç¤ºä¿®æ”¹æ—¥æœŸï¼› % \item æ·»åŠ ä¸æ–‡æ”¯æŒã€‚ % \end{itemize} % % 然而,\cls{ctxdoc} 主è¦ä¾›å†…部使用,代ç è¾ƒä¸ºæ··ä¹±å’Œéšæ„。 % 本模æ¿çš„æ–‡æ¡£æ ·å¼ï¼ˆ\cls{fdudoc})为适应具体需求,对其代ç % 进行了整ç†ï¼Œæ·»åŠ äº†ç›¸å…³æ³¨é‡Šï¼Œå¹¶åšäº†ä¸€äº›æ”¹åŠ¨ï¼š % % \begin{itemize} % \item å…è®¸æ¨¡å—æ ‡è®° |<*|\meta{module}|>| å’Œ |</|\meta{module}|>| % 出现在行å·å·¦ä¾§ï¼› % \item ä¸å†ä»¥ç›´ç«‹ã€å€¾æ–œå—体区分ä¸åŒåµŒå¥—层次的模å—ï¼› % \item 调整索引ä¸ç‰ˆæœ¬å·çš„æŽ’åºæ–¹å¼ï¼› % \item 新增一系列实用命令; % \item 修改文档å—体ã€é…色ç‰ã€‚ % \end{itemize} % % æœ¬æ–‡æ¡£æ ·å¼çš„æ ¸å¿ƒä»£ç ä¸»è¦æ¥è‡ª \cls{ctxdoc} 文档类 v2.4.10。在æ¤ï¼Œæœ¬äººè¦å‘原 % å¼€å‘者 \href{https://github.com/CTeX-org/}{CTEX.ORG} 团队表示感谢。 % % 以下为 \cls{fdudoc} 的具体实现。 % % \subsubsection{载入å®åŒ…ã€æ–‡æ¡£ç±»} % % \begin{macrocode} %<*doc> \ExplSyntaxOff % \end{macrocode} % % æ— éœ€è½½å…¥ \pkg{thumbpdf}。 % \begin{macrocode} \@namedef{ver@thumbpdf.sty}{9999/99/99} % \end{macrocode} % % \changes{v0.8}{2021/10/21}{[\pkg{fdudoc}] 使用 \pkg{gbt7714} å®åŒ…处ç†å‚考文献。} % % 载入å®åŒ…和文档类。 % \begin{macrocode} \LoadClass[a4paper, full]{l3doc} \RequirePackage[heading, sub3section, fontset=none]{ctex} \RequirePackage[sort&compress]{gbt7714} \RequirePackage{ caption, geometry, graphicx, listings, makecell, siunitx, tabularx, threeparttable, unicode-math, xcolor, xcolor-material, xunicode, zref-base } % \end{macrocode} % % \subsubsection{\env{macrocode} 环境} % % \paragraph{继承的代ç } % % \begin{macro}[int]{\macro@code} % 在 \pkg{doc} å®åŒ…ä¸ï¼Œ\env{macrocode} çŽ¯å¢ƒçš„æ ¸å¿ƒåŠŸèƒ½ç”±å‘½ä»¤ \tn{macro@code} % 负责实现,而 \tn{xmacro@code} åªç”¨æ¥ç»“æŸ \env{macrocode} 环境。但在 % \cls{l3doc} ä»¥åŠ \cls{ctxdoc} ä¸ï¼Œ \tn{xmacro\-@\-code} 则基本接管了 % \tn{macro@code} 的功能。åŽè€…æ¤æ—¶åªèµ·è¾…助作用。 % \begin{macrocode} \def\macro@code{% % \end{macrocode} % 调整å‰åŽé—´è·ï¼Œç¦æ¢ \env{macrocode} 环境å‰çš„分页。 % \begin{macrocode} \topsep \MacrocodeTopsep \@beginparpenalty \predisplaypenalty % \end{macrocode} % 将列表å‰åŽçš„é™„åŠ åž‚ç›´ç©ºç™½è®¾ä¸º 0ã€‚æ ¹æ® \cls{ctxdoc} 修改。 % \begin{macrocode} \partopsep \z@skip % \if@inlabel\leavevmode\fi % \end{macrocode} % 构建 \env{trivlist} 环境,设置段间è·ä¸º 0。之åŽä¿®æ”¹å—体,并调节左å³é—´è·ã€‚ % \tn{MacroIndent} ä¼šæ ¹æ®ä»£ç 行数更新,具体细节è§åŽæ–‡ã€‚\tn{macro@font} 用æ¥åœ¨ % ä¸åŒæ¨¡å—è§åˆ‡æ¢å—体。本文档类ä¸ä½¿ç”¨ \tn{AltMacroFont}ï¼Œå› æ¤è¿™é‡Œæ”¹ç”¨ % \tn{MacroFont} 代替。 % \begin{macrocode} \trivlist \parskip \z@ \item[]% % \macro@font \MacroFont \leftskip\@totalleftmargin \advance\leftskip\MacroIndent \rightskip\z@ \parindent\z@ \parfillskip\@flushglue % \end{macrocode} % 按照 \LaTeXe{} ä¸ \tn{verbatim} 环境ä¸å®šä¹‰ \tn{par},使得空行å¯ä»¥åŽŸæ ·è¾“å‡ºï¼Œ % å¦åˆ™ç©ºè¡Œä¼šè¢«åƒæŽ‰ã€‚ % \begin{macrocode} \blank@linefalse \def\par{\ifblank@line \leavevmode\fi \blank@linetrue\@@par \penalty\interlinepenalty} % \end{macrocode} % \tn{obeylines} 将把回车符 |^^M| å˜æˆ \tn{par}。接下æ¥å°†æ‰€æœ‰ç‰¹æ®Šç¬¦å·çš„类别ç % 设为 12,å³â€œå…¶ä»–â€ç±»ã€‚ % \begin{macrocode} \obeylines \let\do\do@noligs \verbatim@nolig@list \let\do\@makeother \dospecials % \end{macrocode} % 相当于退出 |\begin{list}| å’Œ |\begin{minipage}|。 % \begin{macrocode} \global\@newlistfalse \global\@minipagefalse % \end{macrocode} % åˆå§‹åŒ–交å‰å¼•用功能。 % \begin{macrocode} \init@crossref} % \end{macrocode} % \end{macro} % % \begin{macrocode} %<@@=fdudoc> \ExplSyntaxOn % \end{macrocode} % % \begin{variable}{\l_@@_tmpa_tl,\l_@@_tmpb_tl} % 临时å˜é‡ã€‚ % \begin{macrocode} \tl_new:N \l_@@_tmpa_tl \tl_new:N \l_@@_tmpb_tl % \end{macrocode} % \end{variable} % % \begin{macro}{\@@_patch_cmd:Nnn,\@@_preto_cmd:Nn,\@@_appto_cmd:Nn} % è¡¥ä¸å·¥å…·ã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_patch_cmd:Nnn #1#2#3 { \ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3} { } { \ctex_patch_failure:N #1 } } \cs_new_protected:Npn \@@_preto_cmd:Nn #1#2 { \ctex_preto_cmd:NnnTF #1 { } {#2} { } { \ctex_patch_failure:N #1 } } \cs_new_protected:Npn \@@_appto_cmd:Nn #1#2 { \ctex_appto_cmd:NnnTF #1 { } {#2} { } { \ctex_patch_failure:N #1 } } % \end{macrocode} % \end{macro} % % \paragraph{代ç 行处ç†} % % \begin{macro}[int]{\xmacro@code,\sxmacro@code} % 釿–°å®žçް \env{macrocode} 与 \env{macrocode*} çŽ¯å¢ƒçš„æ ¸å¿ƒåŠŸèƒ½ï¼Œå°†å¯¹ä»£ç é€è¡Œ % 处ç†ã€‚åŽè€…ä¼šå°†ç©ºæ ¼æ˜¾ç¤ºä¸ºâ€œ\verb*| |â€ã€‚ % \begin{macrocode} \cs_set_protected_nopar:Npn \xmacro@code { \@@_marco_code:w } \cs_set_protected_nopar:Npn \sxmacro@code { \fontspec_print_visible_spaces: \xmacro@code } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_marco_code:w} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_marco_code:w { % \end{macrocode} % æ ¹æ® \tn{codeline@index} 是å¦ä¸º |true| é€‰æ‹©æ˜¯å¦æ˜¾ç¤ºè¡Œå·ã€‚ % \begin{macrocode} \ifcodeline@index \@@_marco_code_every_par:n { \@@_code_line_no: } \else: \@@_marco_code_every_par:n { } \fi: % \end{macrocode} % è®¾ç½®ä»£ç æ®µç»“æŸæ ‡è®°ä¸ºâ€œ\verb*|% \end{macrocode}^^M|â€ã€‚ % \begin{macrocode} \@@_make_finish_tag:x { \@currenvir } % \end{macrocode} % 开始 \env{macrocode}。 % \begin{macrocode} \@@_macro_code_start:w } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_marco_code_every_par:n} % åœ¨æ¯æ®µä¹‹å‰æ’å…¥å†…å®¹ã€‚è¿™é‡Œæ¯æ®µå³ç›¸å½“于æ¯è¡Œã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_marco_code_every_par:n #1 { \everypar { \everypar {#1} \if@inlabel \global \@inlabelfalse \@noparlistfalse \llap { \box \@labels \hskip \leftskip } \fi #1 } } % \end{macrocode} % \end{macro} % % 设置 \tn{endlinechar} 为 $-1$ï¼Œè¡¨ç¤ºè¡Œæœ«ä¸æ’入任何å—符(实际上相当于在行尾 % æ’入注释符 |%|)。 % \begin{macrocode} \group_begin: \int_set:Nn \tex_endlinechar:D { -1 } % \end{macrocode} % % \begin{variable}{\c_@@_active_space_tl} % 活动å—ç¬¦ç±»çš„ç©ºæ ¼ï¼ˆASCII ç 为 32)。 % \begin{macrocode} \use:n { \char_set_catcode_active:n { 32 } \tl_const:Nn \c_@@_active_space_tl } { } \group_end: % \end{macrocode} % \end{variable} % % ASCII ç 13 是回车符 |^^M|。将其设置为活动å—符。 % \begin{macrocode} \group_begin: \char_set_catcode_active:n { 13 } % \end{macrocode} % % \begin{macro}{\@@_make_finish_tag:n,\@@_make_finish_tag:x} % \env{macrocode} ç»“å°¾æ ‡è®°ã€‚å±•å¼€åŽå˜æˆâ€œ\verb*|% \end{#1}^^M|â€ã€‚ % \begin{macrocode} \cs_new_protected:Npx \@@_make_finish_tag:n #1 { \tl_set:Nn \exp_not:N \l_@@_macro_code_finish_tl { \c_percent_str \prg_replicate:nn { 4 } { \exp_not:o { \c_@@_active_space_tl } } \exp_not:o { \active@escape@char } end \c_left_brace_str #1 \c_right_brace_str \exp_not:N ^^M } } \cs_generate_variant:Nn \@@_make_finish_tag:n { x } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_macro_code_start:w} % 开始代ç 环境。æ¤å‘½ä»¤ä¸»è¦æ˜¯ä¸ºäº†é˜²æ¢ |\begin{macrocode}| åŽå‡ºçŽ°å¤šä½™çš„ç©ºè¡Œã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_macro_code_start:w #1 { \str_if_eq:nnTF {#1} { ^^M } { \@@_macro_code_read_line:w } { \@@_macro_code_read_line:w #1 } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_macro_code_read_line:w} % é€è¡Œè¯»å–代ç ,并连åŒè¡Œå°¾å›žè½¦ç¬¦ä¸€å¹¶å˜å…¥ \cs{l_@@_macro_code_line_tl}。如果该行 % ä¸Žç»“æŸæ ‡è®°â€œ\verb*|% \end{macrocode}^^M|â€ç›¸åŒï¼Œåˆ™ç»“æŸæ¤ \env{macrocode}ï¼› % å¦åˆ™ç»§ç»å¤„ç†è¯¥è¡Œä»£ç 。 % \begin{macrocode} \cs_new_protected:Npn \@@_macro_code_read_line:w #1 ^^M { \tl_set:Nn \l_@@_macro_code_line_tl { #1 ^^M } \tl_if_eq:NNTF \l_@@_macro_code_line_tl \l_@@_macro_code_finish_tl { \exp_args:Nx \end { \@currenvir } } { \@@_macro_code_process_line: \@@_macro_code_read_line:w } } % \end{macrocode} % \end{macro} % % \changes{v0.4}{2017/08/09}{[\pkg{fdudoc}] ä¿®å¤ \cls{ctxdoc} % 文档类 v2.4.10 之å‰ç‰ˆæœ¬ä¸è¡Œè·åå°çš„é—®é¢˜ï¼Œè§ ctex-kit % \href{https://github.com/CTeX-org/ctex-kit/issues/303}{\#303}。} % % \begin{macro}{\@@_swap_cr:,\@@_swap_cr_aux:w} % 把 \cs{l_@@_macro_code_line_tl} ä¸çš„回车符 |^^M| 挪到外é¢ã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_swap_cr: { \exp_after:wN \@@_swap_cr_aux:w \l_@@_macro_code_line_tl } \cs_new_protected:Npn \@@_swap_cr_aux:w #1 ^^M { \group_insert_after:N ^^M \tl_set:Nn \l_@@_macro_code_line_tl {#1} } % \end{macrocode} % \end{macro} % % \begin{variable}{\c_@@_active_cr_tl} % 活动å—符类的回车符。 % \begin{macrocode} \tl_const:Nn \c_@@_active_cr_tl { ^^M } \group_end: % \end{macrocode} % \end{variable} % % \begin{variable}{\l_@@_macro_code_line_tl, % \l_@@_macro_code_finish_tl, % \g_@@_macro_code_verbatim_stop_tl} % 分别用æ¥å˜å‚¨ä»£ç 行ã€\env{macrocode} ç»“æŸæ ‡è®°ä»¥åŠæŠ„å½•åœæ¢æ ‡è®°ã€‚ % \begin{macrocode} \tl_new:N \l_@@_macro_code_line_tl \tl_new:N \l_@@_macro_code_finish_tl \tl_new:N \g_@@_macro_code_verbatim_stop_tl % \end{macrocode} % \end{variable} % % \begin{macro}{\@@_process_normal_line:} % 普通代ç è¡Œæ ¹æ®å¼€å¤´å—符分别处ç†ã€‚ % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_process_normal_line: { \str_case_e:nnF { \str_head:N \l_@@_macro_code_line_tl } { % \end{macrocode} % 以 |%| 开头的行先由 \cs{tl_tail:N} 去掉 |%|,之åŽå†æ£€æŸ¥ |<|。 % \begin{macrocode} { \c_percent_str } { \@@_check_angle:x { \tl_tail:N \l_@@_macro_code_line_tl } } % \end{macrocode} % 以 |#| å¼€å¤´çš„è¡ŒæŒ‰æ³¨é‡Šçš„æ ¼å¼è¾“出。 % \begin{macrocode} { \c_hash_str } { \@@_output_comment_line: } } % \end{macrocode} % å…¶ä½™æ£å¸¸è¾“出。 % \begin{macrocode} { \@@_output_line: } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_process_verbatim_line:} % å¤„ç†æŠ„å½•ä»£ç è¡Œï¼ˆä¸æ£€æŸ¥ |%| 与 |<|)。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_process_verbatim_line: { % \end{macrocode} % å°†è¯¥è¡Œä¸ŽæŠ„å½•åœæ¢æ ‡è®°è¿›è¡Œæ¯”较。 % \begin{macrocode} \tl_if_eq:NNTF \l_@@_macro_code_line_tl \g_@@_macro_code_verbatim_stop_tl % \end{macrocode} % 若相åŒï¼Œåˆ™ç»“æŸæŠ„å½•çŽ¯å¢ƒï¼Œæ¸…ç©ºæŠ„å½•åœæ¢æ ‡è®°ï¼Œå¹¶è¾“å‡ºè¯¥æ ‡è®°ï¼› % \begin{macrocode} { \tl_gclear:N \g_@@_macro_code_verbatim_stop_tl \cs_gset_eq:NN \@@_macro_code_process_line: \@@_process_normal_line: \@@_output_module:nn { \color { verb@guard } } { \@@_swap_cr: \@@_module_pop:n { \l_@@_macro_code_line_tl } } } % \end{macrocode} % å¦åˆ™ç›´æŽ¥è¾“出抄录代ç 。 % \begin{macrocode} { \tl_use:N \l_@@_macro_code_line_tl } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_macro_code_process_line:} % 处ç†ä»£ç 行。该命令的作用如下: % \begin{itemize} % \item æ£å¸¸æƒ…况下,ç‰åŒäºŽ \cs{@@_process_normal_line:}ï¼› % \item 在 \cs{DontCheckModules} 之åŽï¼Œç‰ä»·äºŽ \cs{@@_output_line:}, % å³ä¸æ£€æŸ¥æ¨¡å—æ ‡è®°ï¼Œç›´æŽ¥è¾“å‡ºï¼› % \item 在抄录环境ä¸ï¼Œç‰ä»·äºŽ \cs{@@_process_verbatim_line:}, % æ¤æ—¶å°†ä¸å†ç‰¹æ®Šå¤„ç†ä»¥ |%| 开头的代ç 行。 % \end{itemize} % \begin{macrocode} \cs_new_eq:NN \@@_macro_code_process_line: \@@_process_normal_line: % \end{macrocode} % \end{macro} % % \paragraph{æ¨¡å—æ ‡è®°å¤„ç†} % % \begin{macro}{\CheckModules,\DontCheckModules} % é€‰æ‹©æ˜¯å¦æ£€æŸ¥æ¨¡å—æ ‡è®°ã€‚è¿™ä¸¤ä¸ªå‘½ä»¤åœ¨ \pkg{doc} å®åŒ…ä¸å·²æœ‰å®šä¹‰ï¼Œæ¤å¤„釿–°å£°æ˜Žã€‚ % \begin{macrocode} \DeclareDocumentCommand \CheckModules { } { \cs_set_eq:NN \@@_macro_code_process_line: \@@_process_normal_line: } \DeclareDocumentCommand \DontCheckModules { } { \cs_set_eq:NN \@@_macro_code_process_line: \@@_output_line: } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_check_angle:n,\@@_check_angle:x} % 检查第一个å—ç¬¦æ˜¯å¦æ˜¯ |<|。若是,则检查模å—ï¼›å¦åˆ™ç«‹åˆ»è¾“出改行。 % è¯¥å‡½æ•°çš„å‚æ•°ä¸å¸¦ |%|。 % \begin{macrocode} \cs_new_protected:Npn \@@_check_angle:n #1 { \str_if_eq:eeTF { \str_head:n {#1} } { < } { \@@_check_module:x { \tl_tail:n {#1} } } { \@@_output_comment_line: } } \cs_generate_variant:Nn \@@_check_angle:n { x } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_check_module:n,\@@_check_module:x} % 检查紧跟 |<| 之åŽçš„å—ç¬¦ã€‚å…±æœ‰å››ç§æƒ…况: % \begin{itemize} % \item |*|:模å—开始(|%<*|\meta{module}|>|); % \item |/|:模å—结æŸï¼ˆ|%</|\meta{module}|>|); % \item |@|:åå—空间(|%<@@=|\meta{namespace}|>|); % \item |<|:抄录环境开始(|%<<|\meta{end-tag})。 % \end{itemize} % è‹¥ä¸æ˜¯è¿™å‡ ç§æƒ…况,则为å•独一行的独立模å—(|%<|\meta{module}|>|)。 % \begin{macrocode} \cs_new_protected:Npn \@@_check_module:n #1 { \str_case_e:nnF { \str_head:n {#1} } { { * } { \@@_module_star:w } { / } { \@@_module_slash:w } { @ } { \@@_module_at:w } { < } { \@@_module_verb:w } } { \@@_module_pm:w } % \end{macrocode} % 傿•° |#1| 将被上é¢å‡ 个 |:w| åž‹å‡½æ•°åƒæŽ‰ã€‚ % \begin{macrocode} #1 \q_stop } \cs_generate_variant:Nn \@@_check_module:n { x } % \end{macrocode} % \end{macro} % % 设置 |>| 为活动å—符。 % \begin{macrocode} \group_begin: \char_set_catcode_active:N \> % \end{macrocode} % % \begin{macro}{\@@_module_star:w} % 模å—å¼€å§‹æ ‡è®°ã€‚ % \begin{arguments} % \item |*|\meta{module} % \item 之åŽçš„代ç % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_module_star:w #1 > #2 \q_stop { % \end{macrocode} % 临时å˜é‡ \cs{l_@@_tmpa_tl} ä¿å˜ |<*|\meta{module}|>| 之åŽçš„部分,å³çœŸå®žä»£ç 。 % \begin{macrocode} \tl_set:Nn \l_@@_tmpa_tl {#2} % \end{macrocode} % 判æ–该行是å¦ä¸ºç©ºï¼ˆåªå«ä¸€ä¸ªå›žè½¦ç¬¦ |^^M|)。 % \begin{macrocode} \tl_if_eq:NNTF \l_@@_tmpa_tl \c_@@_active_cr_tl % \end{macrocode} % 若是,则将 |<|\meta{module}|>| 放在行å·çš„å³ä¾§ï¼› % \begin{macrocode} { \@@_output_module:nn { \@@_star_color: } { \@@_module_push:n { \@@_module_angle:n {#1} } } } % \end{macrocode} % å¦åˆ™æ”¾åœ¨å·¦ä¾§ï¼Œå¹¶è¾“出相应代ç 。 % \begin{macrocode} { \@@_output_module_left:nn { \@@_star_color: } { \@@_module_push:n { \@@_module_angle:n {#1} } } } \@@_output_line:n {#2} } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_module_slash:w} % 模å—ç»“æŸæ ‡è®°ã€‚结构与 \cs{@@_module_star:w} 相åŒã€‚ % \begin{arguments} % \item |/|\meta{module} % \item 之åŽçš„代ç % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_module_slash:w #1 > #2 \q_stop { \tl_set:Nn \l_@@_tmpa_tl {#2} \tl_if_eq:NNTF \l_@@_tmpa_tl \c_@@_active_cr_tl { \@@_output_module:nn { \@@_slash_color: } { \@@_module_pop:n { \@@_module_angle:n {#1} } } } { \@@_output_module_left:nn { \@@_slash_color: } { \@@_module_pop:n { \@@_module_angle:n {#1} } } } \@@_output_line:n {#2} } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_module_at:w} % åå—空间。 % \begin{arguments} % \item åå—空间的å称(ä¸å« |@@=|) % \item 之åŽçš„代ç % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_module_at:w @ @ = #1 > #2 \q_stop { \@@_output_module:nn { \color { at@guard } } { \@@_module_angle:n { @ @ = #1 } } % \end{macrocode} % 设置åå—空间为 |#1|。\cls{l3doc} ä¸å°†åå—空间称为“模å—â€ï¼ˆmodule), % 注æ„ä¸è¦æ··æ·†ã€‚ % \begin{macrocode} \tl_gset:Nn \g__codedoc_module_name_tl {#1} \@@_output_line:n {#2} } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_module_verb:w} % 抄录开始。|#1|: |<|\meta{end-tag}ï¼Œåªæœ‰ä¸€ä¸ª |<|。\meta{end-tag} 的最åŽä¼š % 带有一个回车符 |^^M|。 % \begin{macrocode} \cs_new_protected:Npn \@@_module_verb:w #1 \q_stop { % \end{macrocode} % é‡å®šä¹‰ \cs{@@_macro_code_process_line:},用以输出抄录行。 % \begin{macrocode} \cs_gset_eq:NN \@@_macro_code_process_line: \@@_process_verbatim_line: % \end{macrocode} % è®¾ç½®æŠ„å½•åœæ¢æ ‡è®°ã€‚用 \cs{tl_tail:n} 去掉开头的 |<|。 % \begin{macrocode} \tl_gset:Nx \g_@@_macro_code_verbatim_stop_tl { \c_percent_str \tl_tail:n {#1} } % \end{macrocode} % 输出 |%<<|\meta{end-tag}。 % \begin{macrocode} \@@_output_module:nn { \color { verb@guard } } { \@@_swap_cr: \@@_module_push:n { \l_@@_macro_code_line_tl } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_module_pm:w} % 处ç†å•独一行的模å—。|<|\meta{module}|>| 放在行å·çš„左侧。 % \begin{arguments} % \item \meta{module} % \item 之åŽçš„代ç % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_module_pm:w #1 > #2 \q_stop { \@@_output_module_left:nn { \@@_pm_color: } { \@@_module_angle:n {#1} } \@@_output_line:n {#2} } \group_end: % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_output_line:n,\@@_output_line:} % 输出代ç è¡Œã€‚å‚æ•°å°†è¢«å˜å…¥ \cs{l_@@_macro_code_line_tl}, % å†ç”±ä¸å¸¦å‚数的版本调用。 % \begin{macrocode} \cs_new_protected:Npn \@@_output_line:n #1 { \tl_set:Nn \l_@@_macro_code_line_tl {#1} % \end{macrocode} % 若为空行(åªå«ä¸€ä¸ª |^^M|),则直接输出(æ¢è¡Œï¼‰ã€‚ % \begin{macrocode} \tl_if_eq:NNTF \l_@@_macro_code_line_tl \c_@@_active_cr_tl { \tl_use:N \l_@@_macro_code_line_tl } { % \end{macrocode} % 检查开头是å¦ä¸º |%|ï¼Œæ®æ¤åˆ†åˆ«å¤„ç†ã€‚ % \begin{macrocode} \str_if_eq:eeTF { \str_head:N \l_@@_macro_code_line_tl } { \c_percent_str } { \@@_output_comment_line: } { \@@_output_line: } } } \cs_new_protected_nopar:Npn \@@_output_line: { \tex_noindent:D % \end{macrocode} % æ¤å¤„将把 |@@| 替æ¢ä¸ºç›¸åº”çš„åå—空间。 % \begin{macrocode} \@@_replace_at_at:N \l_@@_macro_code_line_tl \tl_use:N \l_@@_macro_code_line_tl } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_output_comment_line:} % 输出注释代ç 行。用ç°è‰²ã€æ–œä½“显示。 % \begin{macrocode} \cs_new_protected:Npn \@@_output_comment_line: { \tex_noindent:D \group_begin: \__fdudoc_swap_cr: \color { code@gray } \slshape \@@_output_line: \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_replace_at_at:N, % \@@_replace_at_at_aux:Nn,\@@_replace_at_at_aux:No} % 把 |@@| 替æ¢ä¸ºç›¸åº”çš„åå—空间。其åç§°å˜æ”¾åœ¨å…¨å±€å˜é‡ % \cs{g__codedoc_module_name_tl} ä¸ã€‚它为空时(|%<@@=>|),ä¸åšæ›¿æ¢ã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_replace_at_at:N #1 { \tl_if_empty:NF \g__codedoc_module_name_tl { \@@_replace_at_at_aux:No #1 \g__codedoc_module_name_tl } } \cs_new_protected:Npn \@@_replace_at_at_aux:Nn #1#2 { % \end{macrocode} % 以下代ç 分别对应两ç§åå—空间的替æ¢ï¼š % \begin{itemize} % \item 内部å˜é‡ï¼š|\|\meta{type}|_@@_|\meta{name} $\to$ % |\|\meta{type}|__|\meta{namespace}|_|\meta{name}ï¼› % \item 内部函数:|\@@_|\meta{name}†$\to$ % |\__|\meta{namespace}|_|\meta{name}â€ï¼‰ã€‚ % \end{itemize} % \begin{macrocode} \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 } \tl_replace_all:Nnn #1 { @ @ } { _ _ #2 } } \cs_generate_variant:Nn \@@_replace_at_at_aux:Nn { No } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_module_push:n, % \@@_module_push_aux:nn,\@@_module_push_aux:on} % 将模å—ååŽ‹å…¥æ ˆä¸ã€‚æ¤å¤„çš„æ ˆä¸»è¦ç”¨æ¥å¤„ç†æ¨¡å—åï¼ˆåŒ…æ‹¬æŠ„å½•æ ‡è®°ï¼‰ä¹‹é—´çš„è¶…é“¾æŽ¥ã€‚ % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_module_push:n { \@@_module_push_aux:on { \int_use:N \c@HD@hypercount } } \cs_new_protected:Npn \@@_module_push_aux:nn #1 { \seq_gpush:Nn \g_@@_module_dest_seq {#1} \hypersetup { hidelinks } \exp_args:Nx \hdclindex { \zref@extractdefault { HD.#1 } { guard@end } { 1 } } { } } \cs_generate_variant:Nn \@@_module_push_aux:nn { on } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_module_pop:n, % \@@_module_pop_aux:nn,\@@_module_pop_aux:on} % 将模å—åé‡Šæ”¾å‡ºæ ˆã€‚ % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_module_pop:n { \seq_gpop:NNTF \g_@@_module_dest_seq \l_@@_tmpa_tl { \@@_module_pop_aux:on { \l_@@_tmpa_tl } } { \BOOM \use:n } } \cs_new_protected:Npn \@@_module_pop_aux:nn #1 { \zref@labelbylist { HD.#1 } { fdudoc } \hypersetup { hidelinks } \hdclindex {#1} { } } \cs_generate_variant:Nn \@@_module_pop_aux:nn { on } % \end{macrocode} % \end{macro} % % \begin{variable}{\g_@@_module_dest_seq} % å˜æ”¾æ¨¡å—åçš„åºåˆ—ï¼ˆæ ˆï¼‰ã€‚ % \begin{macrocode} \seq_new:N \g_@@_module_dest_seq % \end{macrocode} % \end{variable} % % 处ç†è¡Œå·è¶…链接。使用 \pkg{zref} å®åŒ…。 % \begin{macrocode} \zref@newlist { fdudoc } \zref@newprop { guard@end } [ 1 ] { \int_eval:n { \c@HD@hypercount - 1 } } \zref@addprop { fdudoc } { guard@end } % \end{macrocode} % % \paragraph{æ ¼å¼å¤„ç†} % % \begin{macro}{\MacroFont} % 代ç 部分的å—体。 % \begin{macrocode} \cs_set_protected:Npn \MacroFont { \linespread { 1.05 } \small \ttfamily \mdseries \upshape \@@_verb_addon: } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_output_module:nn,\@@_output_module_left:nn} % 输出模å—å(分行内和行å·å·¦ä¾§ä¸¤ç§ï¼‰ã€‚ % \begin{arguments} % \item é¢œè‰²ç‰æ ·å¼ % \item 模å—å % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_output_module:nn #1#2 { \tex_noindent:D \group_begin: #1 \footnotesize \normalfont \sffamily #2 \group_end: } \cs_new_protected:Npn \@@_output_module_left:nn #1#2 { \tex_noindent:D \hbox_overlap_left:n { \@@_output_module:nn {#1} {#2} \skip_horizontal:n { \leftskip + \smallskipamount } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_star_color:,\@@_slash_color:,\@@_pm_color:} % é€‰æ‹©æ¨¡å—æ ‡è®°çš„é¢œè‰²ã€‚æ¨¡å—æ ‡è®°çš„é¢œè‰²ä¼šæ ¹æ®åµŒå¥—层次而改å˜ã€‚ % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_star_color: { \seq_gpop:NNTF \g_@@_star_color_seq \current@color { \set@color } { \@@_select_color: } \seq_gpush:No \g_@@_slash_color_seq { \current@color } } \cs_new_protected_nopar:Npn \@@_slash_color: { \seq_gpop:NNTF \g_@@_slash_color_seq \current@color { \set@color \seq_gpush:No \g_@@_star_color_seq { \current@color } } % TODO: éœ€è¦æŠ¥é”™ï¼šstar 与 slash æ²¡æœ‰åŒ¹é… { \BOOM } } \cs_new_protected_nopar:Npn \@@_pm_color: { \seq_get:NNTF \g_@@_star_color_seq \current@color { \set@color } { \@@_select_color: \seq_gpush:No \g_@@_star_color_seq { \current@color } } } % \end{macrocode} % \end{macro} % % \begin{variable}{\g_@@_star_color_seq,\g_@@_slash_color_seq} % å˜æ”¾æ¨¡å—æ ‡è®°é¢œè‰²çš„åºåˆ—。 % \begin{macrocode} \seq_new:N \g_@@_star_color_seq \seq_new:N \g_@@_slash_color_seq % \end{macrocode} % \end{variable} % % \begin{macro}{\@@_select_color:} % \begin{macro}[int]{guard@series} % è®¾ç½®æ¨¡å—æ ‡è®°çš„色系。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_select_color: { \color { guard@series!!+ } } \definecolorseries { guard@series } { cmyk } { last } { blue } { purple } % \end{macrocode} % \end{macro} % \end{macro} % % 设置色系的增é‡å¤§å°ã€‚å¯é€‰å‚æ•° |3| æ„味ç€åŸºè‰²ï¼ˆblue)与末色(purple)之间将被 % ç‰åˆ†ä¸ºä¸‰ä»½ã€‚è¯¥æ•°å—æ¯”åµŒå¥—æœ€å¤§æ·±åº¦å° 1。 % \begin{macrocode} \resetcolorseries [ 3 ] { guard@series } % \end{macrocode} % % \begin{macro}[int]{verb@guard,at@guard,code@gray} % 设置颜色。 % \begin{macrocode} \definecolor { verb@guard } { named } { MaterialLime600 } \definecolor { at@guard } { named } { MaterialPink } \definecolor { code@gray } { named } { MaterialGrey } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_module_angle:n} % 输出“$\langle\cdots\rangle$â€ã€‚ % \begin{macrocode} \cs_new_protected:Npn \@@_module_angle:n #1 { < #1 > } % { \textlangle #1 \textrangle } % { \ensuremath \langle #1 \ensuremath \rangle } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_code_line_no:} % 行å·ã€‚设置为阿拉伯数å—。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_code_line_no: { \int_gincr:N \c@CodelineNo \hbox_overlap_left:n { \hbox_to_wd:nn { \MacroIndent } { \HD@target \tex_hss:D \@@_code_line_no_style: \theCodelineNo \enspace } \tex_kern:D \@totalleftmargin } } \tl_set:Nn \theCodelineNo { \arabic { CodelineNo } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_code_line_no_style:} % è¡Œå·æ ¼å¼ã€‚ % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_code_line_no_style: { \color { code@gray } \normalfont \sffamily \tiny } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\HD@SetMacroIndent} % 设置代ç 缩进(行å·ä¸€æ 的宽度)。该命令会写进 |.aux| 辅助文件, % 以便在二次编译时确定最大行å·å®½åº¦ã€‚ % \begin{macrocode} \cs_set_protected:Npn \HD@SetMacroIndent #1 { \group_begin: \settowidth \MacroIndent { \@@_code_line_no_style: \prg_replicate:nn { \tl_count:n {#1} } { 0 } \enspace } \dim_gset_eq:NN \MacroIndent \MacroIndent \group_end: } % \end{macrocode} % \end{macro} % % \subsubsection{\env{function} 环境} % % \begin{macro}{\@@_verb_addon:, % \@@_disable_ecglue:, % \@@_plain_punct_style:} % \begin{macro}[int]{\meta@font@select} % 调整文å—é—´è·ï¼Œä»¥ä¾¿äºŽè®© CJK å—符å 的宽度ç‰äºŽè¥¿æ–‡ç‰å®½å—体ä¸ä¸¤ä¸ªç©ºæ ¼çš„宽度。 % éœ€è¦æŒ‰ç¼–译情况分别定义。 % \begin{macrocode} \sys_if_engine_xetex:TF { \cs_set_eq:NN \@@_verb_addon: \xeCJKVerbAddon \cs_set:Nn \@@_plain_punct_style: { \xeCJKsetup { PunctStyle = plain } } \cs_set:Nn \@@_disable_ecglue: { \xeCJKsetup { CJKecglue } } \@@_appto_cmd:Nn \meta@font@select { \mode_if_inner:T { \@@_disable_ecglue: } } } { \cs_set_eq:NN \@@_verb_addon: \prg_do_nothing: \cs_set_eq:NN \@@_plain_punct_style: \prg_do_nothing: \cs_set:Nn \@@_disable_ecglue: { \ltjsetparameter { autoxspacing = false } } \@@_appto_cmd:Nn \meta@font@select { \@@_disable_ecglue: } } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{environment}{function} % \begin{macro}{\@@_fix_previous_depth:} % 调整 \env{function} 环境å‰åŽé—´è·ã€‚ % \begin{macrocode} \BeforeBeginEnvironment { function } { \par \nointerlineskip } \AtEndEnvironment { function } { \par \cs_gset:Nx \@@_fix_previous_depth: { \prevdepth = \the \prevdepth \space } } \AfterEndEnvironment { function } { \@@_fix_previous_depth: } % \end{macrocode} % \end{macro} % \end{environment} % % \begin{environment}{syntax} % \begin{environment}{fdusyntax} % 在 \env{syntax} å’Œ \env{fdusyntax} 环境å‰è®¾ç½®è‹¥å¹²æ´»åЍå—符。\texttt{\textbar} % ç”¨äºŽåˆ†éš”å¤šä¸ªé€‰é¡¹ï¼Œæ— éœ€å€¾æ–œï¼›|<xxx>| 表示选项,|(xxx)| 表示默认选项。原æ¥çš„ % 括å·ç”¨å®ä¿å˜ï¼Œå¹¶ä¸”使用直立å—体。\env{syntax} 环境å¦éœ€è¦é¢å¤–调整行è·ã€æ ‡ç‚¹ % æ ·å¼åŠå—符间è·ã€‚ % \begin{macrocode} \AtBeginEnvironment { syntax } { \linespread { 1.2 } \@@_plain_punct_style: \@@_disable_ecglue: % \char_set_catcode_active:N | % \char_set_catcode_active:N ( % \char_set_active_eq:NN | \orbar % \char_set_active_eq:NN ( \defaultval@aux } \AtBeginEnvironment { fdusyntax } { \cs_set:Npn \lparen { \textup { ( } } \cs_set:Npn \rparen { \textup { ) } } \char_set_catcode_active:N | \char_set_catcode_active:N < \char_set_catcode_active:N ( \char_set_active_eq:NN | \orbar \char_set_active_eq:NN < \syntaxopt@aux \char_set_active_eq:NN ( \defaultval@aux } % \end{macrocode} % \end{environment} % \end{environment} % % \subsubsection{修订记录索引项} % % \begin{macro}{\@@_ltx_changes:nnn} % ä¿å˜ \pkg{doc} ä¸ \tn{changes@} 的定义。 % \begin{macrocode} \cs_new_eq:NN \@@_ltx_changes:nnn \changes@ % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\changes@} % \changes{v0.4}{2017/07/30}{[\pkg{fdudoc}] è°ƒæ•´ç´¢å¼•æŽ’åºæ–¹å¼ã€‚} % é‡å®šä¹‰ \tn{changes@},在版本å·ä¸€è¡Œæ˜¾ç¤ºä¿®æ”¹æ—¥æœŸã€‚ % \begin{macrocode} \cs_set_protected:Npn \changes@ #1#2 { \@@_save_version_date:nn {#1} {#2} \@@_ltx_changes:nnn {#1} {#2} } % \end{macrocode} % \end{macro} % % \begin{variable}{\g_@@_version_date_prop} % å˜æ”¾ç‰ˆæœ¬å·ä¸Žå¯¹åº”的修改日期。其ä¸é”®ä¸ºç‰ˆæœ¬å·ï¼Œå€¼ä¸º |{å¼€å§‹æ—¥æœŸï¼Œç»“æŸæ—¥æœŸ}|。 % å¼€å§‹æ—¥æœŸä¸Žç»“æŸæ—¥æœŸå¯ä»¥ç›¸åŒã€‚ % \begin{macrocode} \prop_new:N \g_@@_version_date_prop % \end{macrocode} % \end{variable} % % \begin{macro}{\@@_save_version_date:nn} % |nn| 版本最终将被 \tn{changes@} 调用。 % \begin{arguments} % \item ç‰ˆæœ¬å· % \item 日期 % \end{arguments} % 它们分别对应 \tn{change} çš„å‰ä¸¤ä¸ªå‚数(第三个是说明文å—)。 % \begin{macrocode} \cs_new_protected:Npn \@@_save_version_date:nn #1#2 { \prop_get:NnNTF \g_@@_version_date_prop {#1} \l_@@_tmpa_tl { % \end{macrocode} % \cs{l_@@_tmpa_tl} ç›¸å½“äºŽä¸¤ä¸ªå‚æ•°ï¼ˆå¼€å§‹æ—¥æœŸã€ç»“æŸæ—¥æœŸï¼‰ï¼Œå› æ¤éœ€è¦æå‰å±•开。 % \begin{macrocode} \exp_after:wN \@@_save_version_date_aux:nnnn \l_@@_tmpa_tl {#2} {#1} } { \@@_save_version_date_aux:nnn {#1} {#2} {#2} } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_save_version_date_aux:nnnn} % \begin{arguments} % \item 原开始日期 % \item åŽŸç»“æŸæ—¥æœŸï¼ˆæ˜¾ç„¶åº”有 |#1| < |#2|) % \item 新读入的日期 % \item ç‰ˆæœ¬å· % \end{arguments} % 如果 |#3| < |#1|,则读入日期 |#3|ã€|#2|ï¼› % 如果 |#3| > |#2|,则读入日期 |#1|ã€|#3|。 % \begin{macrocode} \cs_new_protected:Npn \@@_save_version_date_aux:nnnn #1#2#3#4 { \@@_if_date_later:nnTF {#1} {#3} { \@@_save_version_date_aux:nnn {#4} {#3} {#2} } { \@@_if_date_later:nnT {#3} {#2} { \@@_save_version_date_aux:nnn {#4} {#1} {#3} } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_save_version_date_aux:nnn} % 将版本å·å’Œæ—¥æœŸå˜å…¥ \cs{g_@@_version_date_prop}。 % \begin{arguments} % \item ç‰ˆæœ¬å· % \item 开始日期 % \item ç»“æŸæ—¥æœŸ % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_save_version_date_aux:nnn #1#2#3 { \prop_gput:Nnn \g_@@_version_date_prop {#1} { {#2} {#3} } } % \end{macrocode} % \end{macro} % % \begin{macro}[TF]{\@@_if_date_later:nn} % \begin{macro}{\@@_parse_date:w} % 比较两个日期。如果 |#1| 在 |#2| 之åŽï¼Œåˆ™ä¸º |true|ï¼›å之为 |false|。 % æ—¥æœŸçš„æ ¼å¼ä¸º YYYY/MM/DDã€‚æ¯”è¾ƒæ–¹æ³•æ˜¯ç›´æŽ¥å°†æ—¥æœŸåŒ–æˆ 8 使•°å—, % æ‰€ä»¥æœˆã€æ—¥å‰çš„ 0 ä¸å¯ä»¥çœç•¥ã€‚ % \begin{macrocode} \prg_new_conditional:Npnn \@@_if_date_later:nn #1#2 { TF, T } { \if_int_compare:w \@@_parse_date:w #1 / / / 0 \q_stop > \@@_parse_date:w #2 / / / 0 \q_stop \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \@@_parse_date:w #1/#2/#3/ #4 \q_stop { #1#2#3 } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}[int]{\CTEX@versionitem} % 版本æ¡ç›®æ ‡ç¾ã€‚如果版本å·ä¸åœ¨ \cs{g_@@_version_date_prop} 里é¢ï¼Œ % 则利用未定义的 \cs{BOOM} 报错。 % \begin{macrocode} \cs_new_protected:Npn \CTEX@versionitem #1 \efill { \@idxitem \prop_get:NnNTF \g_@@_version_date_prop {#1} \l_@@_tmpa_tl { \exp_after:wN \@@_print_version_date:nnn \l_@@_tmpa_tl {#1} } { \BOOM } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_print_version_date:nnn} % 输出版本å·å’Œæ—¥æœŸã€‚å¦‚æžœå¼€å§‹æ—¥æœŸå’Œç»“æŸæ—¥æœŸç›¸åŒï¼Œåˆ™åªè¾“出一项。 % \begin{arguments} % \item 开始日期 % \item ç»“æŸæ—¥æœŸ % \item ç‰ˆæœ¬å· % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_print_version_date:nnn #1#2#3 { \noindent \Hy@raisedlink { \belowpdfbookmark {#3} { HD.#3 } } \textbf {#3} \hfill \hbox:n { \footnotesize \str_if_eq:nnTF {#1} {#2} { ( #1 ) } { ( #1 ~ -- ~ #2 ) } } \par \nopagebreak } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\HDorg@theglossary} % 该命令由 \pkg{hypdoc} å®åŒ…å®šä¹‰ï¼Œç”¨äºŽå˜æ”¾æ ‡å‡†æ–‡æ¡£ç±» \cls{book} ä¸å®šä¹‰çš„ % \tn{theindex} 命令。æ¤å¤„的补ä¸å°†åœ¨ç‰ˆæœ¬å·ä¸€è¡Œæœ€åŽåŠ ä¸Šä¿®æ”¹æ—¥æœŸã€‚ % \begin{macrocode} \ctex_patch_cmd:Nnn \HDorg@theglossary { \let \item \@idxitem } { \let \item \CTEX@versionitem } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\@wrglossary} % 该命令由 \LaTeXe{} å†…æ ¸å®šä¹‰ï¼Œåˆç”± \pkg{hypdoc} å®åŒ…作了修改。 % æ¤å¤„的补ä¸ä½¿å¾—修订记录æ¡ç›®çš„页ç 能够指å‘对应行。 % \begin{macrocode} \ctex_patch_cmd:Nnn \@wrglossary { hdpindex } { \ifnum \c@HD@hypercount = \z@ hdpindex \else hdclindex { \the \c@HD@hypercount } \fi } % \end{macrocode} % \end{macro} % % \subsubsection{命令补ä¸} % % \paragraph{\LaTeXe{} è¡¥ä¸} % % \begin{macro}[int]{\@addtocurcol} % 调整浮动体ã€ä»£ç ç‰ä¸Žæ–‡å—的间è·ã€‚ % è§ \url{http://tex.stackexchange.com/a/40896}。 % \begin{macrocode} \ctex_patch_cmd:Nnn \@addtocurcol { \vskip \intextsep } { \edef \save@first@penalty { \the \lastpenalty } \unpenalty \ifnum \lastpenalty = \@M \unpenalty \else \penalty \save@first@penalty \relax \fi \ifnum \outputpenalty < -\@Mii \addvspace\intextsep \vskip\parskip \else \addvspace\intextsep \fi } \ctex_patch_cmd:Nnn \@addtocurcol { \vskip \intextsep \ifnum \outputpenalty < -\@Mii \vskip -\parskip \fi } { \ifnum \outputpenalty < -\@Mii \aftergroup \vskip \aftergroup \intextsep \aftergroup \nointerlineskip \else \vskip \intextsep \fi } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\@getpen} % å°†æ¢è¡Œæˆ–æ¢é¡µçš„æœ€å¤§ç½šå€¼ç”± \num{10000} 改为 \num{10001}。 % \begin{macrocode} \ctex_patch_cmd:Nnn \@getpen { \@M } { \@Mi } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\l@section,\l@subsection} % 修改目录æ¡ç›®çš„缩进。 % \begin{macrocode} \ctex_patch_cmd:Nnn \l@section { 2.5em } { 1.5em } \ctex_patch_cmd:Nnn \l@subsection { 2.5em } { 1.5em } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\@thehead} % 修改页眉,ç¦ç”¨ \tn{MakeUppercase}。 % \begin{macrocode} \@@_preto_cmd:Nn \@thehead { \cs_set_eq:cN { MakeUppercase \space } \@iden } % \end{macrocode} % \end{macro} % % \begin{macro}{\thebibliography} % \begin{macro}[int]{\HDorg@thebibliography} % å‚考文献一节需è¦ç¼–å·ã€‚ % \begin{macrocode} \ctex_patch_cmd:Nnn \HDorg@thebibliography { \section* } { \section } \cs_set_eq:NN \thebibliography \HDorg@thebibliography % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\GlossaryParms} % 修改修订记录ä¸çš„一些缩进。 % \begin{macrocode} \@@_appto_cmd:Nn \GlossaryParms { \raggedcolumns \cs_set_eq:NN \Hy@writebookmark \HDorg@writebookmark \cs_set:Npn \@idxitem { \par \hangindent 2em } \cs_set:Npn \subitem { \@idxitem \hspace* { 1em } } \cs_set:Npn \subsubitem { \@idxitem \hspace* { 2em } } } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\HoLogo@LaTeXe} % 由于使用了 \pkg{unicode-math},需è¦é¢å¤–修改 \pkg{hologo} ä¸çš„ % \tn{LaTeXe} 命令,以使粗体æ£å¸¸æ˜¾ç¤ºã€‚ % \begin{macrocode} \ctex_patch_cmd:Nnn \HoLogo@LaTeXe { \hbox { \HOLOGO@MathSetup 2 $ _{ \textstyle \varepsilon } $ } } { \hbox { \mathsurround 0pt \relax 2 \if b \expandafter \@car \f@series \@nil $ _{ \textstyle \symbf { \varepsilon } } $ \else $ _{ \textstyle \varepsilon } $ \fi } } % \end{macrocode} % \end{macro} % % \changes{v0.9}{2023/02/17}{[\pkg{fdudoc}] 使用 \pkg{makeindex} 处ç†ç´¢å¼•和修订记录。} % \changes{v0.9}{2023/02/17}{[\pkg{fdudoc}] ä¸å†å¯¹ç´¢å¼•进行汉化。} % % \begin{macro}[int]{\NAT@citexnum} % å°†å‚考文献引用ä¸çš„ hyphen 改为 en-dash。 % \begin{macrocode} \ctex_patch_cmd:Nnn \NAT@citexnum { - \NAT@penalty } { \textendash \NAT@penalty } % \end{macrocode} % \end{macro} % % \paragraph{\cls{l3doc} è¡¥ä¸} % % \begin{macrocode} %<@@=codedoc> % \end{macrocode} % % \begin{macro}{\list} % \cls{l3doc} 会在列表环境ä¸è®¾ç½® \kvopt{\tn{listparindent}}{\tn{z@}}, % 这里将其æ¢å¤ã€‚ % \begin{macrocode} \cs_set_eq:NN \list \@@_oldlist:nn % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_function_descr_start:w} % 抑制首段的 \tn{parskip}。 % \begin{macrocode} \__fdudoc_patch_cmd:Nnn \@@_function_descr_start:w { \noindent } { \skip_vertical:n { -\parskip } \noindent } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_function_assemble:} % 在 \cls{l3doc} ä¸ï¼Œ\env{function} 环境里的 \env{syntax} å’Œ \env{descr} ç›’å % ä¸é—´å˜åœ¨ä¸€æ®µ \tn{med\-skip\-amount} çš„è·ç¦»ã€‚但是如果 \env{syntax} ç›’å为空 % (未使用 \env{syntax} 环境),就会显得ä¸å¥½çœ‹ã€‚æ¤æ—¶é€šè¿‡æŠŠ \tn{medskipamount} % 设置为零æ¥ä¿®æ£ã€‚若盒åéžç©ºï¼Œåˆ™æŠŠ \tn{parskip} 还回去。 % \begin{macrocode} \__fdudoc_preto_cmd:Nn \@@_function_assemble: { \box_if_empty:NTF \g_@@_syntax_box { \skip_zero:N \medskipamount } { \skip_add:Nn \medskipamount { \parskip } } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_typeset_functions:} % 调整 \env{function} 环境的å—体。 % \begin{macrocode} \__fdudoc_patch_cmd:Nnn \@@_typeset_functions: { \small \ttfamily } { \footnotesize \ttfamily } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_typeset_functions:} % å‡å°‘å±•å¼€æ ‡è®°ï¼ˆç”¨æ¥è¡¨æ˜Žä¸è‹±æ–‡æ¨¡æ¿ä¸çš„ä¸åŒç”¨æ³•)å‰çš„ç©ºæ ¼ã€‚ % \begin{macrocode} \__fdudoc_patch_cmd:Nnn \@@_typeset_expandability: { & } { & \skip_horizontal:n { -0.5em } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_typeset_functions:,\@@_macro_init:, % \@@_macro_dump:} % 左侧边注的函数列表采用å•å€è¡Œè·ã€‚ % \begin{macrocode} \__fdudoc_preto_cmd:Nn \@@_typeset_functions: { \MacroFont } \__fdudoc_patch_cmd:Nnn \@@_macro_init: { \hbox:n } { \MacroFont \hbox:n } \__fdudoc_patch_cmd:Nnn \@@_macro_dump: { \hbox_unpack_drop:N } { \MacroFont \hbox_unpack_drop:N } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_meta_original:n} % æ”¹ç”¨æ–‡æœ¬æ¨¡å¼æ˜¾ç¤ºå°–括å·ã€‚ % \begin{macrocode} \__fdudoc_patch_cmd:Nnn \@@_meta_original:n { \ensuremath \langle } { \textlangle } \__fdudoc_patch_cmd:Nnn \@@_meta_original:n { \ensuremath \rangle } { \textrangle } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_macro_end_style:n} % 䏿˜¾ç¤º \env{macro} 环境最åŽçš„ “(\emph{End definition for ...})â€ã€‚ % \begin{macrocode} \cs_set_eq:NN \@@_macro_end_style:n \use_none:n % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_typeset_TF:} % å…³é— |TF| 上的超链接,并且ä¿è¯é¢œè‰²ä¸Žå‡½æ•°ä¸»ä½“一致。 % \begin{macrocode} \cs_set_protected:Npn \@@_typeset_TF: { \group_begin: \exp_args:No \@@_if_macro_internal:nT \l_@@_tmpa_tl { \color [ gray ] { 0.5 } } \itshape TF \makebox [ 0 pt ] [ r ] { \color { red } \underline { \phantom { \itshape TF } \kern -0.1 em } } \group_end: } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_macro_typeset_one:nN} % 在 \env{macro} 环境的侧边æ ä¸ï¼Œ\cls{l3doc} æ ¹æ®å‘½ä»¤çš„é•¿çŸï¼Œåˆ†åˆ«ç”¨ % 普通å—体和紧缩å—体输出。然而很长的命令还是会超出页边。这里用缩放 % ç›’åçš„æ‰‹æ®µä½¿å¾—é•¿å‘½ä»¤ä¹Ÿå¯æ£å¸¸æ˜¾ç¤ºã€‚ % \begin{macrocode} \cs_set_protected:Npn \@@_macro_typeset_one:nN #1#2 { \vbox_set:Nn \l_@@_macro_box { \MacroFont \vbox_unpack_drop:N \l_@@_macro_box \hbox_set:Nn \l_tmpa_box { \@@_print_macroname:nN {#1} #2 } % \end{macrocode} % \tn{marginparwidth} å’Œ \tn{marginparsep} 分别是边注的宽度åŠå…¶åˆ°ç‰ˆå¿ƒçš„è·ç¦»ï¼Œ % \tn{la\-bel\-sep} 则是编å·ç›’åå³ç«¯ä¸Žæ¡ç›®é¦–行文本之间的è·ç¦»ã€‚ % \begin{macrocode} \dim_set:Nn \l_tmpa_dim { \marginparwidth - \labelsep - \marginparsep } \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim { \box_resize_to_wd_and_ht:Nnn \l_tmpa_box { \l_tmpa_dim } { \box_ht:N \l_tmpa_box } } \hbox_overlap_left:n { \box_use:N \l_tmpa_box \skip_horizontal:n { \marginparsep - \labelsep } } } \int_incr:N \l_@@_macro_int } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_print_macroname:nN} % 该函数ä¸å†éœ€è¦æ ¹æ®å‘½ä»¤çš„é•¿çŸåˆ‡æ¢å—体。 % \begin{macrocode} \cs_set_protected:Npn \@@_print_macroname:nN #1#2 { \strut \@@_get_hyper_target:xN { \exp_not:n {#1} \bool_if:NT #2 { \tl_to_str:n {TF} } } \l_@@_tmpa_tl \cs_if_exist:cTF { r@ \l_@@_tmpa_tl } { \exp_args:NNo \label@hyperref [ \l_@@_tmpa_tl ] } { \use:n } { \tl_set:Nn \l_@@_tmpa_tl {#1} % \end{macrocode} % 命令ä¸çš„ç©ºæ ¼æ”¹ç”¨â€œ\textvisiblespaceâ€æ˜¾ç¤ºã€‚ % \begin{macrocode} \tl_replace_all:Non \l_@@_tmpa_tl { \c_catcode_other_space_tl } { \fontspec_visible_space: } \@@_macroname_prefix:o \l_@@_tmpa_tl \@@_macroname_suffix:N #2 } } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_special_index_aux:nnnnnnn} % 该函数在 \cls{l3doc} 䏿œ¬æ¥åªæœ‰ 6 ä¸ªå‚æ•°ã€‚è¿™é‡Œå¢žåŠ äº†ä¸€ä¸ªï¼Œç”¨æ¥è¾…助排åºã€‚ % \begin{arguments} % \item 键(å³å®åç§°å—ç¬¦ä¸²ï¼Œç”¨æ¥æŽ’åºï¼‰ % \item å®åç§° % \item 索引头排åºå—符串(排åºï¼‰ % \item ç´¢å¼•å¤´æ–‡å— % \item 索引头åŽç¼€å—符串(排åºï¼Œæ–°å¢žï¼‰ % \item 索引头åŽç¼€æ–‡å— % \item 索引类型(\opt{main}/\opt{usage} ç‰ï¼‰ % \end{arguments} % \begin{macrocode} \cs_new_protected:Npn \@@_special_index_aux:nnnnnnn #1#2#3#4#5#6#7 { \tl_set:Nn \l_@@_index_escaped_key_tl {#1} \@@_quote_special_char:N \l_@@_index_escaped_key_tl \@@_special_index_set:Nn \l_@@_index_escaped_macro_tl {#2} \str_if_eq:onTF { \@currenvir } { macrocode } { \codeline@wrindex } { \str_case:nnF {#7} { { main } { \codeline@wrindex } { usage } { \index } } { \HD@target \index } } { \tl_if_empty:nF { #3 #4 #5 #6 } { #3 #5 \actualchar #4 #6 \levelchar } \l_@@_index_escaped_key_tl \actualchar { \token_to_str:N \verbatim@font \c_space_tl \l_@@_index_escaped_macro_tl } \encapchar hdclindex { \the \c@HD@hypercount } {#7} } } % \end{macrocode} % \end{macro} % % \subsubsection{æ‚项} % % \begin{macro}{\StopSpecialIndexModule, % \@@_special_index_module:nnnnN} % ä¸å¯¹ \cs{cs} å’Œ \cs{tn} ç‰ç¼–索引。用于目录ã€ç´¢å¼•ç‰ã€‚ % \begin{macrocode} \DeclareDocumentCommand \StopSpecialIndexModule { } { \cs_set_eq:NN \@@_special_index_module:nnnnN \use_none:nnnnn } \tl_map_inline:nn { \actualchar \encapchar \levelchar } { \exp_args:Nx \DoNotIndex { \bslash \tl_to_str:N #1 } } % \end{macrocode} % \end{macro} % % \begin{macro}{\meta} % é‡å®šä¹‰ \cs{meta} 命令,需è¦ç¦ç”¨ä¸æ–‡ã€è¥¿æ–‡ä¹‹é—´çš„ç©ºæ ¼ã€‚ % \begin{macrocode} \RenewDocumentCommand \meta { m } { \group_begin: \sys_if_engine_xetex:T { \xeCJKsetup { CJKecglue = { } } } \@@_meta:n {#1} \group_end: } % \end{macrocode} % \end{macro} % % é‡å®šå‘ \cls{l3doc} ä¸çš„一些æç¤ºä¿¡æ¯ã€‚ % \begin{macrocode} \msg_redirect_name:nnn { l3doc } { foreign-internal } { log } \msg_redirect_name:nnn { l3doc } { print-changes-howto } { log } \msg_redirect_name:nnn { l3doc } { print-index-howto } { log } % \end{macrocode} % % \begin{macrocode} %<@@=> \ExplSyntaxOff % \end{macrocode} % % \subsubsection{æŽ’ç‰ˆæ ·å¼è®¾ç½®} % % 目录ä¸ç¦æ¢å¯¹ \cs{cs} å’Œ \cs{tn} ç‰çš„索引。 % \begin{macrocode} \AtBeginDocument{% \addtocontents{toc}{\StopSpecialIndexModule}} % \end{macrocode} % % 设置 PDF å—符串ä¸çš„命令替æ¢ã€‚ % \begin{macrocode} \pdfstringdefDisableCommands{% \let\path\meta \let\opt\@firstofone} % \end{macrocode} % % \begin{macro}[int]{\@multitoc@starttoc,\@starttoc} % 目录分æ ,相当于调用 \pkg{multitoc} å®åŒ…。 % \begin{macrocode} \let\@multitoc@starttoc\@starttoc \renewcommand*\@starttoc[1]{% \begin{multicols}{2}% \@multitoc@starttoc{#1}% \end{multicols}} % \end{macrocode} % \end{macro} % % \begin{macro}[int]{\@makefntext} % 调整脚注文本缩进。 % \begin{macrocode} \renewcommand\@makefntext[1]{\parindent 0em\noindent\@makefnmark~#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\IndexLayout,\indexname} % 调整索引外观。 % \begin{macrocode} \IndexPrologue{% \section{\indexname}% \textit{æ„大利体的数å—表示对应索引项出现的页ç ï¼› 带下划线的数å—表示定义对应索引项的代ç 行å·ï¼› 其他则表示使用对应索引项的代ç 行å·ã€‚}} \def\IndexLayout{% \newgeometry{ left = 0.85 in, right = 0.85 in, top = 1.25 in, bottom = 1.00 in}% \setlength\IndexMin{0.5\textheight}% \ctexset{section/numbering=false}% \StopSpecialIndexModule} \def\indexname{代ç 索引} % \end{macrocode} % \end{macro} % % \begin{macro}{\usage} % 控制“æè¿°å¯¹åº”索引项的页ç â€æ ·å¼ã€‚在 \pkg{doc} å®åŒ…ä¸çš„定义为\tn{textit}。 % \begin{macrocode} % \def\usage#1{\textsf{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\glossaryname} % 调整修订记录外观。 % \begin{macrocode} \GlossaryPrologue{\section{\glossaryname}} \def\glossaryname{修订记录} % \end{macrocode} % \end{macro} % % å‚è€ƒæ–‡çŒ®ä½¿ç”¨å›½æ ‡çš„é¡ºåºç¼–ç 制。 % \begin{macrocode} \bibliographystyle{gbt7714-numerical} % \end{macrocode} % % \changes{v0.7c}{2019/02/08}{[\pkg{fdudoc}] 修改å®åŒ…手册主è¦å—体。} % \changes{v0.9}{2023/02/18}{[\pkg{fdudoc}] æ›´æ–°å®åŒ…手册å—体。} % % 西文å—体。 % \begin{macrocode} \setmainfont{LibertinusSerif}[ Extension = .otf, UprightFont = *-Regular, BoldFont = *-Bold, ItalicFont = *-Italic, BoldItalicFont = *-BoldItalic, Scale = 1.1] \setsansfont{IBMPlexSansCondensed}[ Extension = .otf, UprightFont = *-Regular, BoldFont = *-Bold, ItalicFont = *-Italic, BoldItalicFont = *-BoldItalic] \setmonofont{lmmonolt10}[ Extension = .otf, UprightFont = *-regular, BoldFont = *-bold, ItalicFont = *-oblique, BoldItalicFont = *-boldoblique] \setmathfont{LibertinusMath-Regular.otf} % \end{macrocode} % % 䏿–‡å—体。 % \begin{macrocode} \setCJKmainfont{SourceHanSerifSC}[ Extension = .otf, UprightFont = *-Regular, BoldFont = *-Bold, ItalicFont = FandolKai-Regular, UprightFeatures = { CharacterWidth = Full }, BoldFeatures = { CharacterWidth = Full }] \setCJKsansfont{SourceHanSansSC}[ Extension = .otf, UprightFont = *-Regular, BoldFont = *-Bold, CharacterWidth = Full] \setCJKmonofont{SourceHanSansSC}[ Extension = .otf, UprightFont = *-Normal, BoldFont = *-Bold, AutoFakeSlant = 0.1763, % = tan(10 deg) Scale = 0.9, CharacterWidth = Full] % \end{macrocode} % % ç‰ˆå¼æŽ’ç‰ˆæ ¼å¼ã€‚ % \begin{macrocode} \ctexset{ section/name = {第,节}, section/format+ = \raggedright, paragraph/runin = false, paragraph/numbering = false, punct = kaiming} \xeCJKsetwidth{·}{0.5em} \setcounter{secnumdepth}{4} \setcounter{tocdepth}{3} \pagestyle{plain} % \end{macrocode} % % å•ä½è®¾ç½®ï¼ˆ\pkg{siunitx} å®åŒ…)。 % \begin{macrocode} \sisetup{ inter-unit-product = \ensuremath{{}\cdot{}}, range-phrase = {--}, uncertainty-mode = separate} % \end{macrocode} % % 超链接设置(\pkg{hyperref} å®åŒ…)。 % \begin{macrocode} \hypersetup{ bookmarksdepth = 4, bookmarksnumbered = true, colorlinks = true, citecolor = MaterialGreen, linkcolor = MaterialPink, urlcolor = MaterialIndigo} % \end{macrocode} % % æµ®åŠ¨ä½“æ ‡é¢˜è®¾ç½®ï¼ˆ\pkg{caption} å®åŒ…)。 % \begin{macrocode} \captionsetup{labelsep=quad, font+=bf} % \end{macrocode} % % å±…ä¸ä¸”è‡ªåŠ¨å»¶ä¼¸çš„åˆ—æ ¼å¼ï¼ˆåˆ©ç”¨ \pkg{tabularx} å®åŒ…çš„ |X| æ ¼å¼æ‰©å±•)。 % \begin{macrocode} \newcolumntype{C}{>{\centering\arraybackslash}X} % \end{macrocode} % % è®¾ç½®æ ‡å‡†åˆ—è¡¨çŽ¯å¢ƒæ ·å¼ï¼ˆ\pkg{enumitem} å®åŒ…)。 % \begin{macrocode} \setlist{noitemsep, topsep=\smallskipamount} \setlist[1]{labelindent=\parindent} \setlist[enumerate]{leftmargin=*} \setlist[itemize]{leftmargin=*} % \end{macrocode} % % \begin{environment}{optdesc} % 用于æè¿°å„选项。设置æ¡ç›®é—´è·ä¸º \tn{marginparsep},与 \cls{l3doc} 一致。 % \begin{macrocode} \newlist{optdesc}{description}{3} \setlist[optdesc]{ font = \mdseries\small\ttfamily, align = right, listparindent = \parindent, labelsep = \marginparsep, labelindent = -\marginparsep, leftmargin = *} % \end{macrocode} % \end{environment} % %^^A TODO: \begin{environment}{tablenotes} % \begin{macro}{tablenotes} % \begin{macro}[int]{tpt@id} % 釿–°å®šä¹‰ \pkg{threeparttable} 包的 \env{tablenotes} çŽ¯å¢ƒï¼Œç”¨äºŽè¡¨æ ¼æ³¨é‡Šã€‚ % æ¤å¤„设定为悬挂缩进。 % \begin{macrocode} \renewlist{tablenotes}{description}{1} \setlist[tablenotes]{ format = \normalfont\itshape\tnote@item, labelwidth = 0.5em, itemindent = 0pt, rightmargin = \tabcolsep, leftmargin = \the\dimexpr\tabcolsep+1em\relax, after = \@noparlisttrue} \AtBeginEnvironment{tablenotes}{% \setlength\parindent{2\ccwd}% \normalfont\footnotesize} \AtBeginEnvironment{threeparttable}{% \stepcounter{tpt@id}% \edef\curr@tpt@id{tpt@\arabic{tpt@id}}} \newcounter{tpt@id} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}[int]{\tnote@item,\TPTtagStyle} % 为 \tn{tnote} å¢žåŠ è¶…é“¾æŽ¥ã€‚ % \begin{macrocode} \def\tnote@item#1{% \Hy@raisedlink{\hyper@anchor{\curr@tpt@id-#1}}#1} \def\TPTtagStyle#1{\textit{\hyperlink{\curr@tpt@id-#1}{#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\UrlAlphabet,\UrlDigits} % ç½‘å€æ–行。\tn{UrlOrds}ã€\tn{UrlAlphabet} å’Œ \tn{UrlDigits} % 分别记录了特殊符å·ã€å—æ¯å’Œæ•°å—ï¼ŒæŠŠå®ƒä»¬ä¾æ¬¡é™„åŠ åœ¨ \pkg{url} å®åŒ… % æä¾›çš„命令 \tn{UrlBreaks} 之åŽï¼Œå³å¯å…许在这些ä½ç½®å¤„æ–行。与 % \cs{fdu_allow_url_break:} çš„åŽŸç†æ˜¯ç›¸åŒçš„。 % \begin{macrocode} \def\UrlAlphabet{% \do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j% \do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t% \do\u\do\v\do\w\do\x\do\y\do\z\do\A\do\B\do\C\do\D% \do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M\do\N% \do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X% \do\Y\do\Z} \def\UrlDigits{% \do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9\do\0} \g@addto@macro\UrlBreaks{\UrlOrds} \g@addto@macro\UrlBreaks{\UrlAlphabet} \g@addto@macro\UrlBreaks{\UrlDigits} % \end{macrocode} % \end{macro} % % ä¸å¯¹ä¸‹åˆ—å„é¡¹æ·»åŠ ç´¢å¼•ã€‚ % \begin{macrocode} \DoNotIndex{\begin,\end, \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, \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, \0,\1,\2,\3,\4,\5,\6,\7,\8,\9} % \end{macrocode} % % å¯ç”¨ç´¢å¼•ã€äº¤å‰å¼•用ã€åކå²è®°å½•。 % \begin{macrocode} \EnableCrossrefs \CodelineIndex \RecordChanges % \end{macrocode} % % \subsubsection{文档层命令} % % \changes{v0.9}{2023/02/18}{[\pkg{fdudoc}] 调整ä¸è‹±æ–‡æ ‡è®°ã€‚} % % \begin{macro}{\exptarget,\rexptarget,\expstar,\rexpstar, % \__codedoc_typeset_exp:,\__codedoc_typeset_rexp:} % 部分命令之åŽçš„æ ‡è®°ï¼Œè¡¨æ˜Žä¸è‹±æ–‡æ¨¡æ¿ä¸çš„ä¸åŒç”¨æ³•。这里的“expâ€å’Œâ€œrexp†% 分别æºè‡ª \LaTeX3 ä¸çš„“expandableâ€å’Œâ€œrestricted-expandableâ€ã€‚ % \begin{macrocode} \newcommand*\exptarget{\Hy@raisedlink{\hypertarget{expstar}{}}} \newcommand*\rexptarget{\Hy@raisedlink{\hypertarget{rexpstar}{}}} \newcommand*\expstar{% \hyperlink{expstar}{\textsuperscript{\rmfamily\scshape en}}} \newcommand*\rexpstar{% \hyperlink{rexpstar}{\textsuperscript{\rmfamily\scshape zh}}} \ExplSyntaxOn \cs_set_eq:NN \__codedoc_typeset_exp: \expstar \cs_set_eq:NN \__codedoc_typeset_rexp: \rexpstar \ExplSyntaxOff % \end{macrocode} % \end{macro} % % \begin{macro}{\marg,\oarg,\parg} % å‡ ç§å‘½ä»¤å‚数: % \begin{itemize} % \item å¿…é€‰å‚æ•°ï¼š|{|\meta{arg}|}|ï¼› % \item å¯é€‰å‚数:|[|\meta{arg}|]|ï¼› % \item 图形傿•°ï¼š|(|\meta{arg}|)|。 % \end{itemize} % \begin{macrocode} \renewcommand*\marg[1]{\{\meta{#1}\}} \renewcommand*\oarg[1]{[\meta{#1}]} \renewcommand*\parg[1]{(\meta{#1})} % \end{macrocode} % \end{macro} % % \begin{macro}{\opt} % 选项å。 % \begin{macrocode} \DeclareDocumentCommand\opt{m}{\texttt{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\kvopt} % \meta{key} |=| \meta{value} 型选项。 % \begin{macrocode} \DeclareDocumentCommand\kvopt{mm} {\texttt{#1\breakablethinspace=\breakablethinspace#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\breakablethinspace} % å…许æ¢è¡Œçš„细间è·ã€‚ % \begin{macrocode} \def\breakablethinspace{\hskip 0.16667em\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\syntaxopt,\defaultval} % \begin{macro}[int]{\syntaxopt@aux,\defaultval@aux} % \env{syntax} ä¸çš„选项åŠå‘½ä»¤é€‰é¡¹ã€‚ % |@aux| 结尾的两个命令用于定义利用 |<>| å’Œ |()| 的简写形å¼ã€‚ % \begin{macrocode} \def\syntaxopt#1{\textit{#1}} \def\defaultval#1{\textbf{\textup{#1}}} \def\syntaxopt@aux#1>{\syntaxopt{#1}} \def\defaultval@aux#1){\defaultval{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\orbar,\TF,\TTF,\TFF} % \env{syntax} ä¸çš„é€‰é¡¹åˆ†éš”ç¬¦ï¼Œä»¥åŠ \opt{true} 或 \opt{false} % é€‰é¡¹çš„å‡ ç§å¿«æ·æ–¹å¼ã€‚ % \begin{macrocode} \def\orbar{\textup{\textbar}} \def\TF{true\orbar false} \def\TTF{\defaultval{true}\orbar false} \def\TFF{true\orbar\defaultval{false}} % \end{macrocode} % \end{macro} % % \begin{environment}{arguments} % 放在 \env{macro} 环境ä¸ï¼Œç”¨äºŽæè¿°å¯¹åº”å‘½ä»¤çš„å‚æ•°ã€‚\cls{l3doc} ä¸çš„定义 % \opt{labelsep} 设置ä¸å¤ªåˆç†ï¼Œä¼šä½¿æ ‡ç¾è¢«è¦†ç›–ï¼Œè¿™é‡Œé‡æ–°å®šä¹‰ã€‚ % \begin{macrocode} \DeclareDocumentEnvironment{arguments}{} {\enumerate[label={\texttt{\#\arabic*:~}}, labelsep=0pt, nolistsep]} {\endenumerate} % \end{macrocode} % \end{environment} % % \begin{macro}{\TeX,\LaTeX,\LaTeXe, % \pdfTeX,\pdfLaTeX,\XeTeX,\XeLaTeX,\LuaTeX,\LuaLaTeX, % \AmSLaTeX,\TeXLive,\MiKTeX,\BibTeX,\biber,\TikZ} % \TeX{} ç›¸å…³æ ‡å¿—ã€‚ % \begin{macrocode} \def\TeX{\hologo{TeX}} \def\LaTeX{\hologo{LaTeX}} \def\LaTeXe{\hologo{LaTeXe}} \def\pdfTeX{\hologo{pdfTeX}} \def\pdfLaTeX{\hologo{pdfLaTeX}} \def\XeTeX{\hologo{XeTeX}} \def\XeLaTeX{\hologo{XeLaTeX}} \def\LuaTeX{\hologo{LuaTeX}} \def\LuaLaTeX{\hologo{LuaLaTeX}} \def\AmSLaTeX{\hologo{AmSLaTeX}} \def\TeXLive{\TeX\ Live} \def\MiKTeX{\hologo{MiKTeX}} \def\BibTeX{\hologo{BibTeX}} \def\biber{\hologo{biber}} % \end{macrocode} % 该定义æ¥è‡ª \file{pgfmanual-en-macros.tex}。 % \begin{macrocode} \def\TikZ{Ti\emph{k}Z} % \end{macrocode} % \end{macro} % % \changes{v0.9}{2023/02/17}{[\pkg{fdudoc}] 移除多余的文档层定义。} % % \paragraph{示例代ç 环境} % % \pkg{listings} å®åŒ…ä¸è¿žå—符 |-| åŽŸæœ¬ä»¥æ•°å¦æ¨¡å¼è¾“出,æ¤å¤„改为普通文本。 % è§ \url{https://tex.stackexchange.com/a/33188}。 % \begin{macrocode} \lst@CCPutMacro\lst@ProcessOther{"2D}{\lst@ttfamily{-{}}{-{}}} \@empty\z@\@empty % \end{macrocode} % % \changes{v0.5}{2017/09/05}{[\pkg{fdudoc}] 移除 \pkg{listings} 关键è¯å®šä¹‰æ–‡ä»¶ã€‚} % % å®šä¹‰å‡ ç§ä»£ç æ ·å¼ã€‚ % \begin{macro}[int]{style@base} % \begin{macrocode} \lstdefinestyle{style@base}{ basewidth = 0.525 em, gobble = 3, lineskip = 2 pt, frame = l, framerule = 1 pt, framesep = 0 pt, escapeinside = {(*}{*)}, basicstyle = \small\ttfamily\color{MaterialGrey900}, keywordstyle = \bfseries\color{MaterialIndigo}, commentstyle = \itshape\color{MaterialGrey600}, stringstyle = \color{MaterialRed}, backgroundcolor = \color{MaterialGrey50} } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{style@shell} % \begin{macrocode} \lstdefinestyle{style@shell}{ style = style@base, rulecolor = \color{MaterialPink}, language = bash, alsoletter = {-}, emphstyle = \color{MaterialGreen800} } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{style@latex} % \begin{macrocode} \lstdefinestyle{style@latex}{ style = style@base, rulecolor = \color{MaterialIndigo}, language = [LaTeX]TeX, alsoletter = {*, -}, texcsstyle = *\color{MaterialDeepOrange}, emphstyle = [1]\color{MaterialGreen800}, emphstyle = [2]\color{MaterialTeal} } % \end{macrocode} % \end{macro} % % \begin{macro}[int]{style@syntax} % \begin{macrocode} \lstdefinestyle{style@syntax}{ basewidth = 0.525 em, gobble = 6, escapeinside = {(*}{*)}, language = [LaTeX]TeX, alsoletter = {*, -}, basicstyle = \footnotesize\ttfamily\color{MaterialGrey900}, keywordstyle = \bfseries\color{MaterialIndigo}, commentstyle = \itshape\color{MaterialGrey600}, texcsstyle = *\color{MaterialDeepOrange}, emphstyle = [1]\color{MaterialGreen800}, emphstyle = [2]\color{MaterialTeal} } % \end{macrocode} % \end{macro} % % \begin{environment}{shellexample} % \begin{environment}{latexexample} % Shell å’Œ \LaTeX{} 示例代ç 。 % \begin{macrocode} \lstnewenvironment{shellexample}[1][]{% \lstset{style=style@shell, #1}}{} \lstnewenvironment{latexexample}[1][]{% \lstset{style=style@latex, #1}}{} % \end{macrocode} % \end{environment} % \end{environment} % % \begin{environment}{fdusyntax} % è¯æ³•说明。用于代替 \cls{l3doc} ä¸çš„ \env{syntax} 环境。 % \begin{macrocode} \lstnewenvironment{fdusyntax}[1][]{% \lstset{style=style@syntax, #1}\vspace{-1.8ex}}{} %</doc> % \end{macrocode} % \end{environment} % % \changes{v0.7c}{2019/03/15}{ä¸å†é™„带 \pkg{latexmk} é…置文件。} % % \clearpage % % \end{implementation} %