10 模仿exam-zh-symbols实现\vec命令封装时不能正确生效?

发布于 2024-08-09 16:31:28

希望将模板文件exam-zh-symbols.sty中使用expl3实现重新定义\vec命令的代码抽取出来,但在MWE中无法正确显示.

下面是MWE,我不太确定是否是变量作用域的问题还是和\AtBeginDocument这一hook有点关系
这是原始exam-zh-symbols.sty片段

% 向量 vec
\int_new:N \l__examzh_symbols_vec_input_count_int

\AtBeginDocument
  {
    \RenewDocumentCommand { \vec } { m }
      { \__examzh_symbols_vec:n {#1} }
  }
\cs_new:Npn \__examzh_symbols_vec:n #1
  {
    % 先检测 #1 有多少个字符
    \__examzh_symbols_vec_detect_number_of_input_str:n {#1}
    % 只有 1 个的:加粗,多于两个的加箭头
    \int_compare:nNnTF { \l__examzh_symbols_vec_input_count_int } = {1}
      { \symbfit {#1} }
      { \overrightarrow {#1} }
  }
\cs_new:Npn \__examzh_symbols_vec_detect_number_of_input_str:n #1
  {
    \int_set:Nn \l__examzh_symbols_vec_input_count_int
      { \str_count:n { #1 } }
  }

这是我测试的MWE

\documentclass{minimal}
\usepackage{ctex}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{unicode-math}
\ExplSyntaxOn
% 向量 vec
\int_new:N \l__examzh_symbols_vec_input_count_int
\RenewDocumentCommand { \vec } { m }
    { \__examzh_symbols_vec:n {#1} }
\cs_new:Npn \__examzh_symbols_vec:n #1
{
% 先检测 #1 有多少个字符
\__examzh_symbols_vec_detect_number_of_input_str:n {#1}
% 只有 1 个的:加粗,多于两个的加箭头
\int_compare:nNnTF { \l__examzh_symbols_vec_input_count_int } = {1}
    { \symbfit {#1} }
    { \overrightarrow {#1} }
}
\cs_new:Npn \__examzh_symbols_vec_detect_number_of_input_str:n #1
{
\int_set:Nn \l__examzh_symbols_vec_input_count_int
    { \str_count:n { #1 } }
检测到的字符数为~:~\int_use:N \l__examzh_symbols_vec_input_count_int.\par
}
\ExplSyntaxOff
\begin{document}
Inline Formula: the first vector:$\vec{a}$,the second vector:$\vec{AB}$ and the final vector:$\vec{abc}$. 

Displaystyle Formula:
\[
\vec{A} \quad \vec{AB} \quad \vec{abc} \quad \symbfit{x} \quad \overrightarrow {1234}
\]

%测试 \__examzh_symbols_vec_detect_number_of_input_str:n 命令
\ExplSyntaxOn
\__examzh_symbols_vec_detect_number_of_input_str:n {1234eee}
\ExplSyntaxOff
\end{document}

附件压缩包如下
new-vec.zip

查看更多

关注者
0
被浏览
238
鱼香肉丝没有鱼先生
鱼香肉丝没有鱼先生.

答案就是 unicode-mathbegin/document 添加了 hook, 并重定义了 \vec, 想要验证并不难

\documentclass{minimal}
\usepackage{unicode-math}
\expandafter\def\expandafter\cmd\expandafter{\meaning\vec}
\begin{document}

\fbox{Before document} \cmd

\fbox{After document} \meaning\vec

\end{document}

image.png

所以, 你要么换个命令名, 要么也 hook 一下.

1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览