<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
% !TEX program = XeLaTeX
%
% DO NOT REMOVE THE MARK MANUALLY (used in l3build) -&gt; %
%
%&lt;package|doc-sty&gt;\NeedsTeXFormat{LaTeX2e}
%&lt;package&gt;\ProvidesExplPackage{hustvisual}
%&lt;doc-sty&gt;\ProvidesExplPackage{hustvisual-doc}
%&lt;package|doc-sty&gt;  {2025-05-07}{1.0.0} %
%&lt;package&gt;  {Visual Identity of Huazhong University of Science and Technology}
%&lt;doc-sty&gt;  {Docmentation Style for hustvisual}
%&lt;*driver&gt;
\documentclass{ctexart}
\usepackage{useclass}
\useclass*[full]{l3doc}
\usepackage{hustvisual}
\usepackage{hustvisual-doc}
\usepackage{mdframed}
\usepackage{marginnote}
\usepackage{siunitx}

\providecommand{\name}{\jobname}
\providecommand{\pkgname}{\pkg{\name}}
\begin{document}
  \DisableImplementation

  \DocInput{\jobname.dtx}
  \DocInput{\jobname-vi.dtx}

  \EnableImplementation
  \DisableDocumentation
  \DocInputAgain
  \PrintChanges
  \PrintIndex
\end{document}
%&lt;/driver&gt;
% \fi
%
% \begin{documentation}
% \title{\pkgname.sty: åŽä¸­ç§‘æŠ€å¤§å­¦è§†è§‰æ&nbsp;‡è¯†æ±‡ç¼–}
% \author
%   {
%     é»„å®‡å¸Œ Huang Yuxi^^A
%     \thanks{
%       \textit{Huang} is his surname.
%     }
%     &lt;^^A
%     \href
%       {mailto:hustvisual@hyxi.dev}
%       {hustvisual@hyxi.dev}^^A
%     &gt;
%   }
% \date{2025-05-07 \quad Version 1.0.0} 
%
% \maketitle
%
% \tableofcontents
%
% \changes{v1.0}{2025-05-06}{Initial release.}
%
% \section{å®åŒ…ä»‹ç»}
%
% æœ¬å®åŒ…æä¾›äº†åŽä¸­ç§‘æŠ€å¤§å­¦è§†è§‰æ&nbsp;‡è¯†ï¼ˆvisual identityï¼‰å®šä¹‰çš„æŽ¥å£ï¼Œ
% é¢„è®¾äº†éƒ¨åˆ†å¸¸ç”¨çš„è§†è§‰æ&nbsp;‡è¯†ï¼Œ
% ä½¿å¾—ç”¨æˆ·å¯ä»¥ä¾¿æ·åœ°åœ¨æ–‡æ¡£ä¸­ä½¿ç”¨ã€‚
%
% \subsection{\pkgname{} å‘è¡Œç‰ˆæœ¬å·\label{sec:version}}
%
% æ›´æ–°ç‰ˆæœ¬å¾€å¾€ä¼šå¸¦æ¥æ–°åŠŸèƒ½å’Œä¿®å¤é—®é¢˜ï¼Œ
% ä½†æœ‰æ—¶ä¹Ÿä¼šä¸å¯é¿å…åœ°å¸¦æ¥ä¸å‘åŽå…¼å®¹çš„ä¿®æ”¹ã€‚
% ä¸ºäº†æ¸…æ™°åœ°ä¼&nbsp;è¾¾ç‰ˆæœ¬ä¹‹é—´çš„å˜åŒ–ï¼Œ
% æœ¬å®åŒ…å‘è¡Œçš„ç‰ˆæœ¬å·ä½¿ç”¨ç±»ä¼¼ä½†ä¸å®Œå…¨åŒäºŽè¯­ä¹‰åŒ–ç‰ˆæœ¬æŽ§åˆ¶ï¼ˆSemantic Versioningï¼‰è§„èŒƒ
% \footnote{\url{https://semver.org/}}ç”¨ä»¥æ&nbsp;‡è¯†ã€‚
% åœ¨æœ¬å®åŒ…ä¸­ï¼Œå¯¹äºŽç‰ˆæœ¬å· |MAJOR.MINOR.PATCH|ï¼Œé€’å¢žç›¸åº”çš„éƒ¨åˆ†æ‰€è¡¨ç¤ºçš„å«ä¹‰å¦‚ä¸‹ï¼š
% \begin{itemize}
%   \item |MAJOR|ï¼šé€’å¢žå¤§ç‰ˆæœ¬å·ï¼Œ
%     è¡¨ç¤ºå·²åœ¨æ­£æ–‡æ–‡æ¡£åŒ–çš„å…¬å¼€æŽ¥å£ä¸Šå­˜åœ¨ä¸å‘åŽå…¼å®¹ï¼ˆbackward compatibilityï¼‰çš„ä¿®æ”¹ï¼Œ
%     ä¸€èˆ¬å¯¹æ–‡æ¡£ä»£ç&nbsp;ä¸ä¿®æ”¹æ—&nbsp;æ³•æ­£å¸¸ç¼–è¯‘ï¼›
%   \item |MINOR|ï¼šé€’å¢žå°ç‰ˆæœ¬å·ï¼Œ
%     è¡¨ç¤ºå·²åœ¨æ­£æ–‡æ–‡æ¡£åŒ–çš„éžå®žéªŒæ€§å…¬å¼€æŽ¥å£ä¸Š\emph{ä¸}å­˜åœ¨ä¸å‘åŽå…¼å®¹ç¼–è¯‘çš„ä¿®æ”¹ï¼Œ
%     ä½†åœ¨å®žéªŒæ€§å…¬å¼€æŽ¥å£ä¸Šå­˜åœ¨ä¸å‘åŽå…¼å®¹çš„ä¿®æ”¹ã€‚
%     ä¸€èˆ¬å¯¹æ–‡æ¡£ä»£ç&nbsp;ä¸ä½œä¿®æ”¹æˆ–è€…åªéœ€å°å¹…ä¿®æ”¹å°±å¯ä»¥æ­£å¸¸ç¼–è¯‘ï¼›
%   \item |PATCH|ï¼šé€’å¢žè¡¥ä¸ç‰ˆæœ¬å·ï¼Œ
%     è¡¨ç¤ºæ–°ç‰ˆæœ¬å«æœ‰å‘åŽå…¼å®¹çš„ bug ä¿®å¤ï¼Œæ–°åŠŸèƒ½ï¼Œæˆ–æ–°çš„è§†è§‰æ&nbsp;‡è¯†ï¼Œ
%     å…¶ä¸­æœªæ–‡æ¡£åŒ–çš„ç§æœ‰æŽ¥å£å¯èƒ½ä¼šå‘ç”Ÿå˜åŒ–ã€‚
% \end{itemize}
% ä»¥ä¸Šå†…å®¹æ‰€æŒ‡çš„â€œå…¬å¼€æŽ¥å£â€ä»…åŒ…æ‹¬ç¬¬ \ref{sec:usage} èŠ‚ä¸­ä»‹ç»çš„ä¾›ç»ˆç«¯ç”¨æˆ·ç›´æŽ¥ä½¿ç”¨çš„æŽ¥å£ã€‚
% ç”¨æˆ·åœ¨æ›´æ–°å®åŒ…æ—¶ï¼Œå¯ä»¥æ&nbsp;¹æ®ç‰ˆæœ¬å·çš„å˜åŒ–ä»¥åŠæ›´æ–°æ—¥å¿—æ¥åˆ¤æ–­æ˜¯å¦éœ€è¦ä¿®æ”¹è‡ªå·±çš„æ–‡æ¡£ã€‚
%
% \section{å¼€å‘è¯´æ˜Ž\label{sec:dev}}
%
% æœ¬èŠ‚ä»‹ç»äº†å®åŒ…çš„å¼€å‘å’Œç»´æŠ¤ç›¸å…³ä¿¡æ¯ï¼Œ
% åŒ…æ‹¬å¦‚ä½•æ·»åŠ&nbsp;æ–°çš„è‰²å½©å’Œå›¾æ¡ˆã€‚
% æœ¬èŠ‚å†…å®¹çš„æŒ‡ä»¤ä»…å¯åœ¨æœ¬å®åŒ…æˆ–è€…å­æ¨¡å—ä¸­ä½¿ç”¨ï¼Œ
% åœ¨æ­£æ–‡æ–‡æ¡£ä¸­ä½¿ç”¨ä¼šå¯¼è‡´ç¼–è¯‘é”™è¯¯ã€‚
%
% \subsection{æ·»åŠ&nbsp;æ–°çš„è‰²å½©}
%
% \begin{function}{\@@_set_color:nnn}
%   \begin{syntax}
%     \cs{@@_set_color:nnn} \marg{è‰²å½©åç§°} \marg{è‰²å½©æ¨¡åž‹} \marg{è‰²å½©å€¼}
%   \end{syntax}
%   \cs{@@_set_color:nnn} æ˜¯ä¸€ä¸ªç”¨äºŽåŒæ—¶å®šä¹‰ \pkg{l3color} å’Œ \pkg{xcolor} ä¸­çš„è‰²å½©çš„å‡½æ•°ã€‚ä¾‹å¦‚ï¼š
%   \begin{verbatim}
%     \@@_set_color:nnn { hustblue } { CMYK } { 100, 74, 27, 0 }
%   \end{verbatim}
%   å®ƒåŒ…æ‹¬ä¸‰ä¸ªå¿…é€‰å‚æ•°ï¼šè‰²å½©åç§°ã€è‰²å½©æ¨¡åž‹å’Œè‰²å½©å€¼ï¼š
%   \begin{arguments}
%   \item[\marg{è‰²å½©åç§°}] è‰²å½©åç§°ï¼Œå¿…é¡»æ˜¯ä¸€ä¸ªåˆæ³•çš„ \pkg{xcolor} è‰²å½©åç§°ã€‚
%   \item[\marg{è‰²å½©æ¨¡åž‹}] è‰²å½©æ¨¡åž‹ï¼Œæ”¯æŒçš„è‰²å½©æ¨¡åž‹åŒ…æ‹¬ \opt{CMYK}ã€\opt{cmyk}ã€\opt{RGB}ã€\opt{rgb} ç­‰ã€‚å…¶ä¸­ \opt{CMYK} æ˜¯æœ¬å®åŒ…æ–°å¢žçš„è‰²å½©æ¨¡åž‹ï¼Œæ”¯æŒ 0--100 èŒƒå›´çš„ \opt{cmyk} è‰²å½©ã€‚
%   \item[\marg{è‰²å½©å€¼}] è‰²å½©å€¼ï¼Œæ”¯æŒç”±é€—å·åˆ†éš”çš„è‰²å½©å€¼ï¼Œæ&nbsp;¼å¼åŒ…æ‹¬ \opt{CMYK}ã€\opt{cmyk}ã€\opt{RGB}ã€\opt{rgb} ç­‰ã€‚
% \end{arguments}
% \end{function}
%
% \subsection{æ·»åŠ&nbsp;æ–°çš„å›¾æ¡ˆ}
%
% æŽ¨èä½¿ç”¨ Inkscape æ‰“å¼€å›¾æ¡ˆçŸ¢é‡å›¾å½¢æ–‡ä»¶ï¼Œ
% å¹¶ä½¿ç”¨ svg2tikz ï¼ˆ\url{https://github.com/xyz2tex/svg2tikz}ï¼‰æ’ä»¶å°†å…¶è½¬æ¢ä¸º TikZ ä»£ç&nbsp;ã€‚
% åœ¨å¯¼å‡ºæ—¶ï¼Œé€‰æ‹© \TeX template ä¸º Tikzpictureï¼Œå¯ç”¨è£åˆ‡ Cropï¼Œå…³é—­è‡ªåŠ¨æ¢è¡Œ Wrap paths å’Œç¼©è¿›é€‰é¡¹ Indent group ï¼Œæ•°å­—ç²¾åº¦ Number of decimal è®¾ç½®ä¸º 3ï¼›ä½¿ç”¨ cm ä¸ºå•ä½ï¼Œå…³é—­ Inkscape origin é€‰é¡¹ï¼Œç¼©æ”¾æ¯”ä¾‹ Scale è®¾ç½®ä¸º 1.0ã€‚
%
% å¯¼å‡ºåŽè¯·ä½¿ç”¨ |scripts/tikz-format.pl| è„šæœ¬è¿›è¡Œæ&nbsp;¼å¼åŒ–ï¼Œ
% è„šæœ¬ä¼šå¯¹ \TikZ ä»£ç&nbsp;è¿›è¡Œæ&nbsp;¼å¼åŒ–ï¼ŒåŒ…æ‹¬ç¼©è¿›ã€æ¢è¡Œã€åˆ&nbsp;é™¤å¤šä½™çš„ç©ºæ&nbsp;¼ç­‰æ“ä½œã€‚
%
% ä¹‹åŽè¯·æ‰‹åŠ¨å°†é¢œè‰²æŒ‰ç…§ä¸€å®šé¡ºåºæ›¿æ¢ä¸ºå¦‚ \cs{l_@@_color_arg_i_tl} å½¢å¼çš„å˜é‡ï¼Œ
% ä»¥ä¾¿äºŽåŽç»­çš„è‰²å½©å‚æ•°ä¼&nbsp;é€’ã€‚
% åœ¨å®Œå…¨æ›¿æ¢åŽï¼Œ
% åˆ&nbsp;é™¤å¼€å¤´çš„ |\definecolor| è¯­å¥ï¼Œ
% å°†å…¶ \TikZ ä»£ç&nbsp;æ”¾å…¥ guard ï¼ˆ|%&lt;*xxx&gt;| è‡³ |%&lt;/xxx&gt;|ï¼‰ä¸­ï¼Œ
% å¹¶æ›´æ–°ç›¸åº”æ–‡æ¡£ï¼Œå®žçŽ°å’Œ |hustvisual.ins| æ–‡ä»¶ã€‚
%
% \begin{function}{\@@_set_vi:n}
%   \begin{syntax}
%     \cs{@@_set_vi:n} \marg{å›¾æ¡ˆå‚æ•°}
%   \end{syntax}
%   \cs{@@_set_vi:n} æ˜¯ä¸€ä¸ªç”¨äºŽè®¾ç½®å›¾æ¡ˆçš„å‡½æ•°ã€‚
%   \marg{å›¾æ¡ˆå‚æ•°} æ˜¯ä¸€ä¸ªç”±é€—å·åˆ†éš”çš„é”®å€¼å¯¹æ—&nbsp;åºåˆ—è¡¨ï¼Œ
%   å…¶ä¸­æ¯ä¸ªé”®å€¼å¯¹çš„æ&nbsp;¼å¼ä¸º \opt{key=value}ã€‚
%   æœ‰äº›é”®å€¼å¯¹æ˜¯å¯é€‰çš„ï¼Œå¦‚æžœæ²¡æœ‰è®¾ç½®ï¼Œåˆ™ä½¿ç”¨é»˜è®¤å€¼ï¼›è€Œæœ‰äº›æ˜¯å¿…é€‰çš„ï¼Œä¸è®¾ç½®åˆ™ä¼šå¯¼è‡´ç¼–è¯‘é”™è¯¯ã€‚
%   å…¶ä¸­é”®å€¼å¯¹çš„å®šä¹‰å¦‚ä¸‹ï¼š
%   \begin{arguments}
%   \item[\opt{dept}] è§†è§‰æ&nbsp;‡è¯†çš„æ‰€å±žå­¦é™¢ï¼Œé»˜è®¤å€¼ä¸º \opt{vi}ï¼Œå³åŽä¸­ç§‘æŠ€å¤§å­¦æ&nbsp;¡çº§çš„è§†è§‰æ&nbsp;‡è¯†ã€‚å­¦é™¢çš„ç¼©å†™ä½¿ç”¨å®˜æ–¹ç½‘ç«™åŸŸåå››çº§å­åŸŸåï¼ˆåŸŸå |.hust.edu.cn| å·¦è¾¹çš„éƒ¨åˆ†ï¼‰ä½œä¸ºç¼©å†™ã€‚
%   \item[\opt{vi}] è§†è§‰æ&nbsp;‡è¯†çš„æ&nbsp;‡è¯†ç¬¦ï¼Œå¿…é€‰å‚æ•°ï¼Œæ˜¯ä¸€ä¸ªç”±é€—å·åˆ†éš”çš„æ—&nbsp;åºåˆ—è¡¨ï¼Œå®åŒ…å†…éƒ¨ä¼šè‡ªåŠ¨å°†å…¶æŽ’åºåŽå­˜å‚¨ä¸ºå”¯ä¸€çš„è§†è§‰æ&nbsp;‡è¯†åç§°ï¼Œä¸Žå’Œ \opt{dept} ä¸€èµ·ä½œä¸ºæŸ¥æ‰¾å›¾æ¡ˆçš„é»˜è®¤æ–‡ä»¶åã€‚
%   \item[\opt{ncolors}] è§†è§‰æ&nbsp;‡è¯†çš„è‰²å½©æ•°é‡ï¼Œé»˜è®¤å€¼ä¸º \opt{0}ï¼Œå³å›¾æ¡ˆä¸­æ²¡æœ‰å¯é…ç½®çš„è‰²å½©ã€‚
%   \item[\opt{temps}] è§†è§‰æ&nbsp;‡è¯†çš„è‰²å½©é¢„è®¾æ¨¡æ¿ï¼Œå¦‚æžœ \opt{ncolors} çš„å€¼å¤§äºŽ \opt{0}ï¼Œåˆ™è¯¥å‚æ•°ä¸ºå¿…é€‰å‚æ•°ã€‚è‰²å½©é¢„è®¾æ¨¡æ¿çš„æ&nbsp;¼å¼ä¸ºæœ‰åºåˆ—è¡¨ \opt{\{temp1=\{color1, color2, ...\}, temp2=\{color3, color1, ...\}, ...\}}ã€‚å…¶ä¸­ \opt{temp1}ã€\opt{temp2} ç­‰ä¸ºè‰²å½©é¢„è®¾æ¨¡æ¿çš„åç§°ï¼Œ\opt{color1}ã€\opt{color2} ç­‰ä¸ºè‰²å½©åç§°ï¼Œè‰²å½©åç§°éœ€è¦ç”± \pkg{xcolor} å®åŒ…å®šä¹‰çš„è‰²å½©åç§°ï¼Œä¸”åˆ—è¡¨ä¸­çš„è‰²å½©æ•°é‡éœ€è¦ç­‰åŒäºŽ \opt{ncolors} çš„å€¼ã€‚å…¶ä¸­ç¬¬ä¸€ä¸ªè‰²å½©é¢„è®¾æ¨¡æ¿ä¼šè¢«ç”¨ä½œé»˜è®¤çš„è‰²å½©é¢„è®¾æ¨¡æ¿ã€‚
%   \item[\opt{filename}] è§†è§‰æ&nbsp;‡è¯†çš„æ–‡ä»¶åï¼Œé»˜è®¤ç¼ºçœï¼Œä½¿ç”¨ç”± \opt{dept} å’Œ \opt{vi} ç”Ÿæˆçš„æ–‡ä»¶åã€‚å¦‚æžœ \opt{filename} çš„å€¼ä¸ä¸ºç©ºï¼Œåˆ™è¯¥å›¾æ¡ˆä¼šè¢«ä½¿ç”¨ç”± \opt{filename} è®¾ç½®çš„æ–‡ä»¶åã€‚
%   \item[\opt{aliases}] è§†è§‰æ&nbsp;‡è¯†çš„åˆ«åï¼Œé»˜è®¤ä¸ºç©ºï¼Œå³æ²¡æœ‰åˆ«åã€‚åˆ«åçš„æ&nbsp;¼å¼ä¸ºæœ‰åºåˆ—è¡¨ \opt{\{\{vi1,vi2\},\{vi2,vi3,vi4\},...\}}ï¼Œå…¶ä¸­ \opt{vi1,vi2}ã€\opt{vi2,vi3,vi4} ç­‰ä¸ºåˆ«åï¼Œä½¿ç”¨æ–¹å¼åŒ \opt{vi}ï¼Œç”¨äºŽæ–¹ä¾¿ç”¨æˆ·è°ƒç”¨ï¼Œä¸éœ€è¦æ¯æ¬¡éƒ½è¾“å…¥å®Œæ•´çš„è§†è§‰æ&nbsp;‡è¯†åç§°ã€‚
%   \end{arguments}
% \end{function}
%
% \section{ä½¿ç”¨è¯´æ˜Ž\label{sec:usage}}
%
% \begin{function}{\hustvi}
%   \begin{syntax}
%     \cs{hustvi}\oarg{é€šç”¨é€‰é¡¹}\marg{è§†è§‰æ&nbsp;‡è¯†}
%   \end{syntax}
%   \cs{hustvi} æ˜¯æœ¬å®åŒ…æä¾›ç»™ç»ˆç«¯ç”¨æˆ·ä½¿ç”¨æœ€é‡è¦çš„ä¸€ä¸ªæŽ¥å£ï¼Œ
%   ä¸€åˆ‡çš„è§†è§‰æ&nbsp;‡è¯†éƒ½æ˜¯é€šè¿‡è¿™ä¸ªé€šç”¨æŽ¥å£æ¥ä½¿ç”¨ã€‚
%   ä¾‹å¦‚ï¼š
%   \marginnote{\hustvi[height=1cm,temp=red]{emblem}}
%   \begin{verbatim}
%     \hustvi[height=1cm,temp=red]{emblem}
%   \end{verbatim}
%   å¯ä»¥åœ¨æ–‡æ¡£ä¸­ä½¿ç”¨å¦‚å·¦é¡µè¾¹æ‰€ç¤ºï¼Œä»¥é€šç”¨é€‰é¡¹ï¼šé«˜ \qty{1}{cm}ã€è‰²å½©é¢„è®¾ä¸º\opt{blue}çš„åŽä¸­ç§‘æŠ€å¤§å­¦æ&nbsp;¡å¾½ã€‚
%   å…¶ä¸­ï¼Œ\marg{è§†è§‰æ&nbsp;‡è¯†}æ˜¯ä¸€ä¸ªç”±é€—å·åˆ†éš”çš„æ—&nbsp;åºåˆ—è¡¨ï¼Œ
%   åˆ—è¡¨ä¸­çš„æ¯ä¸€é¡¹éƒ½æ˜¯ä¸€ä¸ªè§†è§‰æ&nbsp;‡è¯†ä¸­çš„åŸºç¡€å…ƒç´&nbsp;ï¼Œ
%   è¿™äº›å…ƒç´&nbsp;çš„ç»„åˆå¯ä»¥å½¢æˆä¸€ä¸ªå®Œæ•´çš„è§†è§‰æ&nbsp;‡è¯†ã€‚
%   å¦‚æžœè§†è§‰æ&nbsp;‡è¯†ä¸­åªæœ‰ä¸€ä¸ªåŸºç¡€å…ƒç´&nbsp;ï¼Œ
%   åˆ™å¯ä»¥çœç•¥é€—å·åˆ†éš”ç¬¦ã€‚
%   è€Œ\oarg{é€šç”¨é€‰é¡¹}æ˜¯ç”±ä¸€ç³»åˆ—é€—å·åˆ†éš”çš„é”®å€¼å¯¹æ—&nbsp;åºåˆ—è¡¨ç»„æˆçš„å¯é€‰å‚æ•°ï¼Œ
%   æ‰€æœ‰çš„è§†è§‰æ&nbsp;‡è¯†éƒ½å®žçŽ°äº†å¦‚ä¸‹çš„é€šç”¨é€‰é¡¹ï¼š
%   \begin{arguments}
%   \item[\opt{filename}] è§†è§‰æ&nbsp;‡è¯†çš„æ–‡ä»¶åï¼Œé»˜è®¤ç¼ºçœï¼Œé€šå¸¸æƒ…å†µä¸‹ä¸éœ€è¦è®¾ç½®ï¼Œä»…åœ¨éœ€è¦è¦†ç›–åŽŸæœ‰æ–‡ä»¶æ—¶ä½¿ç”¨ã€‚
%   \item[\opt{dept}] è§†è§‰æ&nbsp;‡è¯†çš„æ‰€å±žå­¦é™¢ï¼Œé»˜è®¤å€¼ä¸º \opt{vi}ï¼Œå³åŽä¸­ç§‘æŠ€å¤§å­¦æ&nbsp;¡çº§çš„è§†è§‰æ&nbsp;‡è¯†ã€‚å­¦é™¢çš„ç¼©å†™ä½¿ç”¨å®˜æ–¹ç½‘ç«™åŸŸåå››çº§å­åŸŸåï¼ˆåŸŸå |.hust.edu.cn| å·¦è¾¹çš„éƒ¨åˆ†ï¼‰ä½œä¸ºç¼©å†™ã€‚
%   \item[\opt{width}] è§†è§‰æ&nbsp;‡è¯†çš„å®½åº¦ï¼Œé»˜è®¤å€¼ä¸º \opt{0pt}ï¼Œå³ä½¿ç”¨é»˜è®¤çš„å®½åº¦ã€‚å¦‚æžœä»…è®¾ç½®äº†å®½åº¦è€Œæ²¡æœ‰è®¾ç½®é«˜åº¦ï¼Œåˆ™é«˜åº¦ä¼šè‡ªåŠ¨æŒ‰æ¯”ä¾‹ç¼©æ”¾ï¼›å¦‚æžœåŒæ—¶è®¾ç½®äº†å®½åº¦å’Œé«˜åº¦ï¼Œåˆ™å®½é«˜æ¯”ä¼šè¢«å¼ºåˆ¶ä¸º \opt{width}:\opt{height}ã€‚
%   \item[\opt{height}] è§†è§‰æ&nbsp;‡è¯†çš„é«˜åº¦ï¼Œé»˜è®¤å€¼ä¸º \opt{0pt}ï¼Œæ•ˆæžœåŒä¸Šã€‚
%   \item[\opt{temp}] è§†è§‰æ&nbsp;‡è¯†çš„è‰²å½©é¢„è®¾æ¨¡æ¿ï¼Œä¸åŒè§†è§‰æ&nbsp;‡è¯†çš„è‰²å½©é¢„è®¾æ¨¡æ¿ä¸åŒï¼Œå…·ä½“çš„è‰²å½©é¢„è®¾æ¨¡æ¿è¯·å‚è€ƒå¯¹åº”è§†è§‰æ&nbsp;‡è¯†çš„æ–‡æ¡£ã€‚
%   \item[\opt{colors}] æ‰‹åŠ¨æŒ‰ç…§é¡ºåºè¦†å†™è‰²å½©é¢„è®¾æ¨¡æ¿ï¼ŒåŒæ—¶è®¾ç½®äº† \opt{temp} å’Œ \opt{colors} æ—¶ï¼Œ\opt{colors} ä¼šè¦†ç›– \opt{temp} çš„è®¾ç½®ã€‚ \opt{colors} çš„æ&nbsp;¼å¼ä¸ºæœ‰åºåˆ—è¡¨ \opt{\{color1, color2, ...\}}ï¼Œå…¶ä¸­ \opt{color1}ã€\opt{color2} ç­‰ä¸ºè‰²å½©åç§°ï¼Œè‰²å½©åç§°éœ€è¦ç”± \pkg{xcolor} å®åŒ…å®šä¹‰çš„è‰²å½©åç§°ï¼Œä¸”åˆ—è¡¨ä¸­çš„è‰²å½©æ•°é‡ä¸èƒ½è¶…è¿‡é¢„è®¾æ¨¡æ¿ä¸­çš„è‰²å½©æ•°é‡ã€‚\marginnote{\hustvi[colors={hustblue,black},temp=red,height=1cm]{emblem}} ä¾‹å¦‚ï¼š\cs{hustvi}\opt{\[colors=\{hustblue,black\},temp=red\]\{emblem\}} ï¼ˆå¦‚å·¦é¡µè¾¹æ‰€ç¤ºï¼‰å°±æ˜¯åŸºäºŽ \opt{red} æ¨¡æ¿çš„æ&nbsp;¡å¾½ï¼Œå¯¹å‰ä¸¤ç§é¢œè‰²ä¾åºè¦†å†™äº†åŽç§‘è“ \opt{hustblue} å’Œé»‘è‰² \opt{black} ä¸¤ç§è‰²å½©\footnote{æœ¬é”™è¯¯é…è‰²ç¤ºä¾‹ä»…ç”¨äºŽè¯´æ˜Žï¼Œå®žé™…ä½¿ç”¨æ—¶è¯·éµå¾ªè§†è§‰æ&nbsp;‡è¯†çš„è‰²å½©è§„èŒƒã€‚}ã€‚
%   \item[\opt{opacity}] ï¼ˆå®žéªŒæ€§åŠŸèƒ½ï¼‰è§†è§‰æ&nbsp;‡è¯†çš„é€æ˜Žåº¦ï¼Œé»˜è®¤å€¼ä¸º \opt{1}ï¼Œå³ä¸é€æ˜Žã€‚é€æ˜Žåº¦çš„èŒƒå›´ä¸º \opt{0} åˆ° \opt{1}ï¼Œå…¶ä¸­ \opt{0} è¡¨ç¤ºå®Œå…¨é€æ˜Žï¼Œ\opt{1} è¡¨ç¤ºå®Œå…¨ä¸é€æ˜Žã€‚
%   \end{arguments}
% \end{function}
%
% \end{documentation}
%
% \begin{implementation}
%
%
% \section{\pkgname{} å®žçŽ°ç»†èŠ‚}
%    \begin{macrocode}
%&lt;@@=hustvisual&gt;
%&lt;*package&gt;
%    \end{macrocode}
%
% \subsection{å¸¸é‡å£°æ˜Ž}
%
% \begin{macro}{\c_@@_univ_tl}
% å®šä¹‰æ&nbsp;¡çº§è§†è§‰æ&nbsp;‡è¯†çš„â€œå­¦é™¢â€ \opt{dept} åç§°ã€‚
%    \begin{macrocode}
\tl_const:Nn \c_@@_univ_tl { vi }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c_@@_depts_clist}
% å®šä¹‰äº†å„ä¸ªå­¦é™¢çš„ç¼©å†™ï¼Œä½¿ç”¨å®˜æ–¹ç½‘ç«™åŸŸåå››çº§å­åŸŸåï¼ˆåŸŸå |.hust.edu.cn| å·¦è¾¹çš„éƒ¨åˆ†ï¼‰ä½œä¸ºç¼©å†™ã€‚
% å¦‚é‡ç±»ä¼¼åŒæµŽåŒ»å­¦é™¢ä¸‹è®¾è¯å­¦é™¢ï¼ˆ|pharm.tjmu.edu.cn|ï¼‰æˆ–ç¬¬ä¸€ä¸´åºŠå­¦é™¢ï¼ˆ|whuh.com|ï¼‰çš„ä»¥éžåŽç§‘åŸŸåç»“å°¾çš„å­¦é™¢ï¼Œå¦è¡Œå•†è®®ã€‚
%    \begin{macrocode}
\clist_const:Ne \c_@@_depts_clist
  {
    \c_@@_univ_tl,
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\c_@@_nargs_int, \c_@@_args_clist}
% å‚æ•°ç´¢å¼•ã€‚å¦‚æœ‰éœ€è¦åœ¨è¿™é‡Œä¿®æ”¹å‚æ•°ç´¢å¼•æ•°é‡ã€‚
%    \begin{macrocode}
\int_const:Nn \c_@@_nargs_int { 5 }
\clist_new:N \c_@@_args_clist
\int_step_inline:nn { \c_@@_nargs_int }
  {
    \exp_args:NNe \clist_put_right:Nn \c_@@_args_clist
      {
        \int_to_roman:n { #1 }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \subsection{å˜é‡å£°æ˜Ž}
% \begin{macro}{
%   \l_@@_color_arg_i_tl,
%   \l_@@_color_arg_ii_tl,
%   \l_@@_color_arg_iii_tl,
%   \l_@@_color_arg_iv_tl,
%   \l_@@_color_arg_v_tl,
% }
% ä¼&nbsp;å…¥ \TikZ ä¸­çš„è‰²å½©å‚æ•°ï¼Œé»˜è®¤ä¸ºé»‘è‰²ã€‚
%    \begin{macrocode}
\clist_map_inline:Nn \c_@@_args_clist
  {
    \tl_new:c { l_@@_color_arg_ #1 _tl }
    \tl_set:cn { l_@@_color_arg_ #1 _tl } { black }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l_@@_color_args_clist}
% è‰²å½©å‚æ•°åˆ—è¡¨ã€‚
%    \begin{macrocode}
\clist_new:N \l_@@_color_args_clist
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{
%   \l_@@_dept_tl,
%   \l_@@_vi_clist,
%   \l_@@_ncolors_int,
%   \l_@@_temps_prop,
%   \l_@@_temp_tl,
%   \l_@@_filename_tl,
%   \l_@@_aliases_clist,
%   \l_@@_colors_clist,
%   \l_@@_vi_tl,
%   \l_@@_width_dim,
%   \l_@@_height_dim,
%   \l_@@_opacity_fp,
% }
% è§†è§‰æ&nbsp;‡è¯†ä¸´æ—¶å˜é‡ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_dept_tl
\clist_new:N \l_@@_vi_clist
\int_new:N \l_@@_ncolors_int
\prop_new:N \l_@@_temps_prop
\tl_new:N \l_@@_temp_tl
\tl_new:N \l_@@_filename_tl
\clist_new:N \l_@@_aliases_clist
\clist_new:N \l_@@_colors_clist
\tl_new:N \l_@@_vi_tl
\dim_new:N \l_@@_width_dim
\dim_new:N \l_@@_height_dim
\fp_new:N \l_@@_opacity_fp
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_vi_prop}
% è§†è§‰æ&nbsp;‡è¯†å±žæ€§åˆ—è¡¨ã€‚
%    \begin{macrocode}
\prop_new:N \g_@@_vi_prop
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{è¾…åŠ©å‡½æ•°}
%
% \begin{macro}{
%   \@@_msg_new:nn,
%   \@@_warning:n,
%   \@@_warning:ne,
%   \@@_warning:nee,
%   \@@_warning:neee,
%   \@@_error:n,
%   \@@_error:ne,
%   \@@_error:nee,
%   \@@_error:neee,
%}
% å„ç§ä¿¡æ¯å‡½æ•°çš„ç¼©ç•¥å½¢å¼ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_msg_new:nn { \msg_new:nnn { hustvisual } }
\cs_new:Npn \@@_warning:n { \msg_warning:nn { hustvisual } }
\cs_new:Npn \@@_warning:ne { \msg_warning:nne { hustvisual } }
\cs_new:Npn \@@_warning:nee { \msg_warning:nnee { hustvisual } }
\cs_new:Npn \@@_warning:neee { \msg_warning:nneee { hustvisual } }
\cs_new:Npn \@@_error:n { \msg_error:nn { hustvisual } }
\cs_new:Npn \@@_error:ne { \msg_error:nne { hustvisual } }
\cs_new:Npn \@@_error:nee { \msg_error:nnee { hustvisual } }
\cs_new:Npn \@@_error:neee { \msg_error:nneee { hustvisual } }
%    \end{macrocode}
% \end{macro}
%
% \subsection{å®åŒ…è½½å…¥}
%
%    \begin{macrocode}
\RequirePackage{tikz}
\RequirePackage{xcolor}
%    \end{macrocode}
%
% \subsection{å†…éƒ¨å‡½æ•°}
%
% \begin{macro}{\@@_deploy_colors:}
% å°† \cs{l_@@_color_args_clist} å±•å¼€åˆ°å¯¹åº”çš„å˜é‡æ–¹ä¾¿åœ¨è§†è§‰æ&nbsp;‡è¯†æ–‡ä»¶ï¼ˆ|hustvisual-*.def|ï¼‰ä¸­è°ƒç”¨ã€‚
%    \begin{macrocode}
\@@_msg_new:nn { color-args-exceed }
{
  The~ `colors'~ arguments(#1)~ exceed~ the~ number~ of~ defined~ colors(#2).
  Please~ check~ the~ number~ of~ colors~ in~ the~ documentation~ of~ the~ package.
}
\int_new:N \l_@@_color_nargs_int
\cs_new:Npn \@@_deploy_colors:
  {
    \int_set:Nn \l_@@_color_nargs_int
      { \clist_count:N \l_@@_color_args_clist }
    \int_compare:nNnTF
      { \l_@@_color_nargs_int } &gt; { \c_@@_nargs_int }
      {
        \@@_warning:nee { color-args-exceed }
          { \int_use:N \l_@@_color_nargs_int }
          { \int_use:N \c_@@_nargs_int }
        \@@_deploy_colors:N \c_@@_nargs_int
      }
      {
        \@@_deploy_colors:N \l_@@_color_nargs_int
      }
  }
\tl_new:N \l_@@_color_arg_tl
\cs_new:Npn \@@_deploy_colors:N #1
  {
    \int_step_inline:nn { #1 }
      {
        \tl_set:Nx \l_@@_color_arg_tl
          {
            l_@@_color_arg_
            \clist_item:Nn \c_@@_args_clist { ##1 }
            _tl
          }
        \tl_set:cx
          {
            \l_@@_color_arg_tl
          }
          {
            \clist_item:Nn \l_@@_color_args_clist { ##1 }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_sort_vi_name:, \@@_sort_vi_name:N}
% å¯¹ \cs{l_@@_vi_clist} è¿›è¡ŒæŽ’åºã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_sort_vi_name:
  {
    \@@_sort_vi_name:N \l_@@_vi_clist
  }
\cs_new:Npn \@@_sort_vi_name:N #1
  {
    \clist_sort:Nn #1
      {
        \str_compare:nNnTF { ##1 } &gt; { ##2 }
        { \sort_return_swapped: }
        { \sort_return_same: }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_vi_name:, \@@_vi_name:N, \@@_vi_name:NN}
% ä»Ž \cs{l_@@_dept_tl}ï¼Œå’Œ \cs{l_@@_vi_clist} ä¸­ç”Ÿæˆå”¯ä¸€çš„è§†è§‰æ&nbsp;‡è¯†åç§°ã€‚
%    \begin{macrocode}
\tl_const:Nn \c_@@_dept_sep_tl { - }
\tl_const:Nn \c_@@_vi_sep_tl { - }
\cs_new:Npn \@@_vi_name:
  {
    \@@_vi_name:N \l_@@_vi_clist
  }
\cs_new:Npn \@@_vi_name:N #1
  {
    \@@_vi_name:NN \l_@@_dept_tl #1
  }
\cs_new:Npn \@@_vi_name:NN #1#2
  {
    \tl_use:N #1
    \tl_use:N \c_@@_dept_sep_tl
    \exp_args:NNV \clist_use:Nn #2 \c_@@_vi_sep_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_vi_filename:}
% ç”Ÿæˆè§†è§‰æ&nbsp;‡è¯†æ–‡ä»¶åã€‚
%    \begin{macrocode}
\tl_const:Nn \c_@@_vi_filename_prefix_tl { hustvisual- }
\tl_const:Nn \c_@@_vi_filename_suffix_tl { .def }
\cs_new:Npn \@@_vi_filename:
  {
    \tl_use:N \c_@@_vi_filename_prefix_tl
    \@@_vi_name:
    \tl_use:N \c_@@_vi_filename_suffix_tl
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_prop_default_value:N}
% å®šä¹‰å±žæ€§çš„é»˜è®¤å€¼ä¸ºç¬¬ä¸€ä¸ªæ’å…¥çš„å€¼ã€‚
%    \begin{macrocode}
%\bool_new:N \l_@@_prop_set_bool
\tl_new:N \l_@@_prop_set_tl
\cs_new:Npn \@@_prop_default_value:N #1
  {
    \bool_set_false:N \l_@@_prop_set_bool
%    \end{macrocode}
% \cs{prop_map_break:} å›&nbsp;æœªçŸ¥åŽŸå›&nbsp;æ—&nbsp;æ³•ä½¿ç”¨ã€‚
%    \begin{macrocode}
    \prop_map_inline:Nn #1
      {
        \bool_if:NF \l_@@_prop_set_bool
          {
            \bool_set_true:N \l_@@_prop_set_bool
            \tl_set:Nn \l_@@_prop_set_tl { ##2 }
          }
      }
    \tl_use:N \l_@@_prop_set_tl
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\keys_define:nn { hustvisual }
  {
    dev .meta:nn = { hustvisual / dev } { #1 },
    user .meta:nn = { hustvisual / user } { #1 },
  }
%    \end{macrocode}
%
% \subsection{å­æ¨¡å—æŽ¥å£}
%
% \subsubsection{è‰²å½©å®šä¹‰}
%
% \begin{macro}{\@@_set_color:nnn}
% å®šä¹‰è‰²å½©çš„å‡½æ•°ã€‚åŒæ—¶å®šä¹‰äº† \pkg{l3color} å’Œ \pkg{xcolor} ä¸­çš„è‰²å½©ã€‚
% æ­¤å¤–ï¼Œæ–°å¢žäº† \opt{CMYK} è‰²å½©æ¨¡åž‹çš„æ”¯æŒï¼Œç”¨äºŽæ·»åŠ&nbsp; 0--100 èŒƒå›´çš„ \opt{cmyk} è‰²å½©ã€‚
% \begin{arguments}
%   \item è‰²å½©åç§°
%   \item è‰²å½©æ¨¡åž‹ï¼Œå¦‚ \opt{CMYK}(0--100)ã€\opt{cmyk}(0--1)ã€\opt{RGB}(0--255)ã€\opt{rgb}(0--1) ç­‰
%   \item è‰²å½©å€¼ï¼Œç”¨é€—å·åˆ†éš”çš„æ•°å€¼
% \end{arguments}
%    \begin{macrocode}
\seq_new:N \l_@@_color_models_seq
\seq_new:N \l_@@_color_values_seq
\int_new:N \l_@@_set_colors_int
\tl_new:N \l_@@_color_model_tl
\tl_new:N \l_@@_color_models_tl
\tl_new:N \l_@@_color_values_tl
\clist_new:N \l_@@_set_colors_clist
\cs_new:Npn \@@_set_color:nnn #1#2#3
  {
    \seq_set_split:Nnn \l_@@_color_models_seq { / } { #2 }
    \seq_set_split:Nnn \l_@@_color_values_seq { / } { #3 }
    \int_compare:nNnF
      { \seq_count:N \l_@@_color_models_seq }
      =
      { \seq_count:N \l_@@_color_values_seq }
      {
        \@@_error:nee { color-models-unpair }
          { \seq_count:N \l_@@_color_models_seq }
          { \seq_count:N \l_@@_color_values_seq }
      }
    \exp_args:NNe \int_set:Nn \l_@@_set_colors_int
      { \seq_count:N \l_@@_color_models_seq }
    \int_step_inline:nn { \l_@@_set_colors_int } % ##1
      {
        \tl_set:Ne \l_@@_color_model_tl
          { \seq_item:Nn \l_@@_color_models_seq { ##1 } }
        \exp_args:Nne \str_if_eq:nnT { CMYK }
          { \seq_item:Nn \l_@@_color_models_seq { ##1 } }
          {
            \clist_clear:N \l_@@_set_colors_clist
            \seq_set_item:Nnn \l_@@_color_models_seq { ##1 } { cmyk }
            \exp_args:Ne \clist_map_inline:nn % ####1
              { \seq_item:Nn \l_@@_color_values_seq { ##1 } }
              {
                \clist_put_right:Ne \l_@@_set_colors_clist
                  { \fp_to_decimal:n { \fp_eval:n { ####1 / 100 } } }
              }
            \exp_args:NNnV \seq_set_item:Nnn
              \l_@@_color_values_seq { ##1 } \l_@@_set_colors_clist
          }
      }
    \tl_set:Ne \l_@@_color_models_tl
      { \seq_use:Nn \l_@@_color_models_seq { / } }
    \tl_set:Ne \l_@@_color_values_tl
      { \seq_use:Nn \l_@@_color_values_seq { / } }
    \exp_args:Nnee \color_set:nnn { #1 }
      { \l_@@_color_models_tl }
      { \l_@@_color_values_tl }
    \definecolor { #1 }
      { \l_@@_color_models_tl }
      { \l_@@_color_values_tl }
  }
\@@_msg_new:nn { color-models-unpair }
  {
    The~ number(#1)~ of~ color~ models~ in~ the~ `colors'~
    arguments~ is~ not~ equal~ to~ the~ number(#2)~ of~ color values.
  }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{å›¾æ¡ˆå®šä¹‰}
%
% \begin{macro}{\@@_set_vi:n}
% å®šä¹‰è§†è§‰æ&nbsp;‡è¯†å›¾æ¡ˆçš„å‡½æ•°ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_set_vi:n #1
  {
    \group_begin:
    \keys_set:nn { hustvisual / dev } { #1 }
    \@@_process_set_vi:
    \group_end:
  }
%\prop_new:N \l_@@_colors_clist
\keys_define:nn { hustvisual / dev }
  {
    dept .choices:Vn = \c_@@_depts_clist
      {
        \tl_set_eq:NN \l_@@_dept_tl \l_keys_choice_tl
      },
    dept .initial:V = \c_@@_univ_tl,
    vi .clist_set:N = \l_@@_vi_clist,
    vi .value_required:n = true,
    ncolors .int_set:N = \l_@@_ncolors_int,
    ncolors .initial:V = \c_zero_int,
    temps .meta:nn = { hustvisual / dev / temps } { #1 },
    temps / unknown .code:n =
      {
        \clist_set:Nn \l_@@_colors_clist { #1 }
        \prop_put:NVV \l_@@_temps_prop \l_keys_key_str \l_@@_colors_clist
      },
    filename .tl_set:N = \l_@@_filename_tl,
    filename .initial:V = \c_empty_tl,
    aliases .clist_set:N = \l_@@_aliases_clist,
    aliases .initial:V = \c_empty_clist,
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_process_set_vi:}
% å¤„ç†åœ¨å®šä¹‰è§†è§‰æ&nbsp;‡è¯†å›¾æ¡ˆæ—¶ä¼&nbsp;å…¥çš„å‚æ•°ã€‚
%    \begin{macrocode}
\prop_new:N \l_@@_vi_prop
\int_new:N \l_@@_ncolors_tmp_int
\clist_new:N \l_@@_alias_name_clist
\tl_new:N \l_@@_alias_name_tl
\cs_new:Npn \@@_process_set_vi:
  {
    \prop_clear:N \l_@@_vi_prop
    \int_compare:nNnT
      { \l_@@_ncolors_int } &gt; { \c_@@_nargs_int }
      {
        \@@_error:nee { colors-exceed-max }
          { \int_use:N \l_@@_ncolors_int }
          { \int_use:N \c_@@_nargs_int }
      }
    \prop_put:NnV \l_@@_vi_prop { ncolors } \l_@@_ncolors_int
    \prop_map_inline:Nn \l_@@_temps_prop
      {
        \int_set:Nn \l_@@_ncolors_tmp_int
          { \clist_count:n { ##2 } }
        \int_compare:nNnF
          { \l_@@_ncolors_int } = { \l_@@_ncolors_tmp_int }
          {
            \@@_error:neee { colors-not-match }
              { ##1 }
              { \int_use:N \l_@@_ncolors_tmp_int }
              { \int_use:N \l_@@_ncolors_int }
          }
      }
    \int_compare:nNnF
      { \l_@@_ncolors_int } = { \c_zero_int }
      {
        \int_compare:nNnT
          { \prop_count:N \l_@@_temps_prop } = { \c_zero_int }
          {
            \@@_error:n { no-temp }
          }
      }
    \prop_put:NnV \l_@@_vi_prop { temps } \l_@@_temps_prop
    \@@_sort_vi_name:
    \tl_if_empty:NT \l_@@_filename_tl
      {
        \tl_set:Ne \l_@@_filename_tl
          { \@@_vi_filename: }
      }
    \file_if_exist:VF \l_@@_filename_tl
      {
        \@@_warning:nee { filename-error }
          { \tl_use:N \l_@@_filename_tl }
          { \@@_vi_name: }
      }
    \prop_put:NnV \l_@@_vi_prop { filename } \l_@@_filename_tl
    \prop_if_in:NeT \g_@@_vi_prop { \@@_vi_name: }
      {
        \@@_warning:ne { vi-skip }
          { \@@_vi_name: }
      }
    \prop_gput_if_not_in:NeV \g_@@_vi_prop \@@_vi_name: \l_@@_vi_prop
    \clist_map_variable:NNn \l_@@_aliases_clist \l_@@_alias_name_clist
      {
        \prop_clear:N \l_@@_vi_prop
        \prop_put:Nne \l_@@_vi_prop { source } { \@@_vi_name: }
        \tl_set:Ne \l_@@_alias_name_tl
          { \@@_vi_name:N \l_@@_alias_name_clist }
        \prop_if_in:NVT \g_@@_vi_prop \l_@@_alias_name_tl
          {
            \@@_warning:nee { vi-skip }
              { \l_@@_alias_name_tl }
          }
        \prop_gput_if_not_in:NVV \g_@@_vi_prop
          \l_@@_alias_name_tl
          \l_@@_vi_prop
      }
  }
\@@_msg_new:nn { colors-exceed-max }
  {
    The~ number(#1)~ of~ colors~ in~ the~ `ncolors'~ property~
    exceeds~ the~ maximum~ number(#2)~ of~ colors.~
    Please~ increase~ the~ number~ of~ colors~ in~ the~ \c_@@_nargs_int.
  }
\@@_msg_new:nn { no-temp }
  {
    The~ `temps'~ property~ should~ be~ set~ to~ a~ list~ of~ colors,~
    when~ the~ `ncolors'~ property~ is~ not~ zero.
  }
\@@_msg_new:nn { colors-not-match }
  {
    The~ number(#2)~ of~ colors~ in~ the~ `temps'~ property(#1)~
    does~ not~ match~ the~ number(#3)~ asserted~ in~ the~
    `ncolors'~ property.
  }
\@@_msg_new:nn { filename-error }
  {
    The~ filename~(#1)~ of~ the~ vi(#2)~
    is~ not~ found~ in~ the~ TeX~ search~ path.~
    Please~ check~ the~ filename.
  }
\@@_msg_new:nn { vi-skip }
  {
    The~ vi~(#1)~ is~ already~ defined.~
    The~ new~ definition~ has~ been~ skipped.
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{ç”¨æˆ·æŽ¥å£}
%
% \begin{macro}{\hustvi}
% æ’å…¥è§†è§‰æ&nbsp;‡è¯†å›¾æ¡ˆçš„ä¸»å‡½æ•°ã€‚
%    \begin{macrocode}
\NewDocumentCommand \hustvi { O{} m }
  {
    \group_begin:
    \keys_set:nn { hustvisual / user }
      {
        #1,
        vi = { #2 },
      }
    \@@_process_vi_name:
    \@@_process_temp:
    \@@_process_colors:
    \@@_process_file:
    \@@_process_vi:
    \group_end:
  }
\keys_define:nn { hustvisual / user }
  {
    dept .choices:Vn = \c_@@_depts_clist
      {
        \tl_set_eq:NN \l_@@_dept_tl \l_keys_choice_tl
      },
    vi .clist_set:N = \l_@@_vi_clist,
    vi .value_required:n = true,
    filename .tl_set:N = \l_@@_filename_tl,
    filename .initial:V = \c_empty_tl,
    width .dim_set:N = \l_@@_width_dim,
    width .initial:V = \c_zero_dim,
    height .dim_set:N = \l_@@_height_dim,
    height .initial:V = \c_zero_dim,
    temp .tl_set:N = \l_@@_temp_tl,
    temp .initial:V = \c_empty_tl,
    colors .clist_set:N = \l_@@_colors_clist,
    colors .initial:V = \c_empty_clist,
    opacity .fp_set:N = \l_@@_opacity_fp,
    opacity .initial:V = \c_one_fp,
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_process_vi_name:}
% å¤„ç†è§†è§‰æ&nbsp;‡è¯†å”¯ä¸€åç§°ä»¥åŠåˆ«åçš„å‡½æ•°ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_source_name_tl
\cs_new:Npn \@@_process_vi_name:
  {
    \@@_sort_vi_name:
    \prop_get:NeNF \g_@@_vi_prop \@@_vi_name: \l_@@_vi_prop
      {
        \@@_error:nee { invalid-vi-name }
          { \l_@@_dept_tl }
          { \l_@@_vi_clist }
      }
    \prop_get:NnNT \l_@@_vi_prop { source } \l_@@_source_name_tl
      {
        \prop_get:NVN \g_@@_vi_prop
          \l_@@_source_name_tl
          \l_@@_vi_prop
      }
  }
\@@_msg_new:nn { invalid-vi-name }
  {
    The~ combination~ of~ `dept'(#1)~ and~ `vi'(#2)~
    is~ not~ valid.~
    Please~ check~ the~ documentation~ of~ the~ package.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_process_temp:}
% å¤„ç†è§†è§‰æ&nbsp;‡è¯†è‰²å½©é¢„è®¾æ¨¡æ¿çš„å‡½æ•°ã€‚
%    \begin{macrocode}
\bool_new:N \l_@@_prop_set_bool
\cs_new:Npn \@@_process_temp:
  {
    \prop_get:NnN \l_@@_vi_prop { temps } \l_@@_temps_prop
    \prop_get:NVNF \l_@@_temps_prop
      \l_@@_temp_tl \l_@@_color_args_clist
      {
        \tl_if_empty:NF \l_@@_temp_tl
          {
            \@@_warning:ne { invalid-temp }
              { \l_@@_temp_tl }
          }
        \bool_set_false:N \l_@@_prop_set_bool
        \prop_map_inline:Nn \l_@@_temps_prop
          {
            \bool_if:NF \l_@@_prop_set_bool
              {
                \bool_set_true:N \l_@@_prop_set_bool
                \clist_set:Nn \l_@@_color_args_clist { ##2 }
              }
          }
      }
    \@@_deploy_colors:
  }
\@@_msg_new:nn { invalid-temp }
  {
    The~ `temp'~ property~(#1)~ is~ not~ valid.~
    The~ default~ template~ will~ be~ used.~
    Please~ check~ the~ documentation~ of~ the~ package.
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_process_colors:}
% å¤„ç†è§†è§‰æ&nbsp;‡è¯†å›¾æ¡ˆè¦†å†™è‰²å½©çš„å‡½æ•°ã€‚
%    \begin{macrocode}
\tl_new:N \l_@@_color_tl
\cs_new:Npn \@@_process_colors:
  {
    \clist_if_empty:NF \l_@@_colors_clist
      {
        \clist_set_eq:NN \l_@@_color_args_clist \l_@@_colors_clist
        \@@_deploy_colors:
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_process_file:}
% è¯»å–è§†è§‰æ&nbsp;‡è¯†æ–‡ä»¶ï¼ˆ|hustvisual-*.def|ï¼‰ï¼Œå¹¶å°†å…¶å†…å®¹å‰åŽæ·»åŠ&nbsp; \TikZ çŽ¯å¢ƒã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_process_file:
  {
    \tl_if_empty:NT \l_@@_filename_tl
      {
        \prop_get:NnN \l_@@_vi_prop { filename } \l_@@_filename_tl
      }
    \file_get:VnNF \l_@@_filename_tl { \ExplSyntaxOn } \l_@@_vi_tl
      {
        \@@_error:ne { file-not-found }
          { \tl_use:N \l_@@_filename_tl }
      }
    \tl_gput_left:Nn \l_@@_vi_tl
      {
        \begin{tikzpicture}[
          inner~sep=0pt,
          outer~sep=0pt,
          opacity=\fp_use:N \l_@@_opacity_fp
        ]
      }
    \tl_gput_right:Nn \l_@@_vi_tl
      {
        \end{tikzpicture}
        \color_fill:n {red}
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_process_vi:}
% å¤„ç†è§†è§‰æ&nbsp;‡è¯†å›¾æ¡ˆå°ºå¯¸çš„å‡½æ•°ã€‚
%    \begin{macrocode}
\box_new:N \l_@@_vi_box
\cs_new:Npn \@@_process_vi:
  {
    \exp_args:NNV \hbox_set:Nn \l_@@_vi_box \l_@@_vi_tl
    \dim_compare:nNnTF
      { \l_@@_width_dim } &gt; { \c_zero_dim }
      {
        \dim_compare:nNnTF
        { \l_@@_height_dim } &gt; { \c_zero_dim }
        {
          \exp_args:NNVV \box_resize_to_wd_and_ht:Nnn \l_@@_vi_box
            \l_@@_width_dim \l_@@_height_dim
        }
        {
          \exp_args:NNV \box_resize_to_wd:Nn \l_@@_vi_box \l_@@_width_dim
        }
      }
      {
        \dim_compare:nNnT
        { \l_@@_height_dim } &gt; { \c_zero_dim }
        {
          \exp_args:NNV \box_resize_to_ht:Nn \l_@@_vi_box \l_@@_height_dim
        }
      }
    \box_use:N \l_@@_vi_box
  }
\@@_msg_new:nn { file-not-found }
  {
    The~ file~(#1)~ is~ not~ found.~
    Please~ check~ the~ file~ name.
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%&lt;/package&gt;
%    \end{macrocode}
% \subsection{æ–‡æ¡£æ&nbsp;·å¼}
%    \begin{macrocode}
%&lt;*doc-sty&gt;
%    \end{macrocode}
%
% è§£å†³ |Package multicol Error: Error saving partial page.|
% æ–¹æ³•æ¥è‡ªäºŽ \url{https://tex.stackexchange.com/a/95893}ã€‚
%    \begin{macrocode}
\setlength\IndexMin{100pt}
%    \end{macrocode}
%
% \begin{macro}[no-user-doc]{\TikZ}
%    \begin{macrocode}
\newcommand\TikZ{Ti\emph{k}Z}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[no-user-doc]{\key}
% ç”¨äºŽåœ¨æ–‡æ¡£ä¸­è¾“å‡ºè‡ªå®šä¹‰ç´¢å¼•çš„å‘½ä»¤ï¼Œä¸»è¦ç”¨äºŽé”®å€¼å¯¹çš„é”®çš„ç´¢å¼•ã€‚ä»…å½“ç´¢å¼•é¡¹çš„çˆ¶åˆ†ç±»ä¸º |hustvi| æ—¶ï¼Œå³ç”¨äºŽæ–‡æ¡£ç±»é€‰é¡¹æ—¶ï¼Œéšè—çˆ¶åˆ†ç±»ã€‚
%  \begin{arguments}
%    \item åœ¨ç´¢å¼•ä¸­æ˜¾ç¤ºé¡¹çš„çˆ¶åˆ†ç±»ï¼Œé»˜è®¤ä¸º \opt{hustvi}ã€‚
%    \item å‘½ä»¤æœ¬ä½“ã€‚
%  \end{arguments}
%    \begin{macrocode}
\DeclareDocumentCommand \key { O{hustvi} m }
  {
    \tl_if_eq:nnTF { #1 } { hustvi }
      { \cmd[module=#1/]{#2} }
      { \cmd[module=#1/]{#1/#2} }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}[no-user-doc]{\opt}
% è¾“å‡ºé”®å€¼å¯¹çš„å€¼ã€‚
%    \begin{macrocode}
\DeclareDocumentCommand \opt { s m }
  { \IfBooleanTF {#1} { \texttt{\bfseries \upshape #2} } { \texttt{\upshape #2} } }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\g_@@_show_vi_bool}
% å®šä¹‰æ˜¯å¦æ˜¾ç¤ºè§†è§‰æ&nbsp;‡è¯†å®žçŽ°çš„å…¨å±€å˜é‡ï¼Œé»˜è®¤ä¸ºä¸æ˜¾ç¤ºã€‚
%    \begin{macrocode}
\bool_new:N \g_@@_show_vi_bool
\bool_gset_false:N \g_@@_show_vi_bool
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{viimplementation}
% å®šä¹‰å®žçŽ°è§†è§‰æ&nbsp;‡è¯†æ‰€éœ€è¦çš„æ–‡æ¡£çŽ¯å¢ƒã€‚
%    \begin{macrocode}
\NewDocumentEnvironment { viimplementation } { }
  {
    \bool_if:NF \g_@@_show_vi_bool { \comment }
  }
  {
    \bool_if:NF \g_@@_show_vi_bool { \endcomment }
  }
%    \end{macrocode}
% \end{environment}
%
%    \begin{macrocode}
%&lt;/doc-sty&gt;
%    \end{macrocode}
%
% \section{å­æ¨¡å—å®žçŽ°ç»†èŠ‚}
%
% \end{implementation}
</pre></body></html>