-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
有办法使 xCJKecglue 随着字体而变化吗? #31
Comments
可以在 \documentclass{article}
\usepackage{xeCJK} % loads fontspec internally
\setmainfont{TeX Gyre Schola} % Latin fonts specification
\usepackage{everysel}
\makeatletter
\newcommand*\SETCJKECGLUE{%
\ifcase\strcmp{\f@series}{\bfdefault} %
\xeCJKsetup
{ xCJKecglue = {\hskip 0.213em plus 0.05em minus 0.05em\relax} }%
\else
\xeCJKsetup
{ xCJKecglue = {\hskip 0.222em plus 0.05em minus 0.05em\relax} }%
\fi
}
\EverySelectfont{\SETCJKECGLUE}
\makeatother
\begin{document}
\huge
第1章 \bfseries 第1章
\showoutput
\end{document} 差别很小:
|
@qinglee 感谢介绍的 \newcommand*\SETCJKECGLUE{%
\ifcase\strcmp{\f@family}{\rmdefault} % 罗马/衬线字族
\ifcase\strcmp{\f@series}{\mddefault} % 常规体字重
\ifcase\strcmp{\f@shape}{\updefault} % 常规体直立体
\xeCJKsetup{ xCJKecglue = <glue> }%
\else % 常规体斜体
\xeCJKsetup{ xCJKecglue = <glue> }%
\fi
\else % 粗体字重
\ifcase\strcmp{\f@shape}{\updefault} % 粗体直立体
\xeCJKsetup{ xCJKecglue = <glue> }%
\else % 粗体斜体
\xeCJKsetup{ xCJKecglue = <glue> }%
\fi
\fi
\else
\ifcase\strcmp{\f@family}{\sfdefault} % 无衬线字族
% 重复罗马字族的代码,先区分常规体、粗体,再在各自内部分直立体、斜体
\else % 等宽字族,都等宽了则不需要分字重、形状
\xeCJKsetup{ xCJKecglue = <glue> }%
\fi
\fi
} 如果是 TG Termes、Heros、Cursor 这种经典搭配,只需要最外层判断字族 |
|
@stone-zeng 看起来我的用法不对?另:“less than one if the first argument sorts lower (lexicographically)” 是否有误?因为 0 也是小于 1 的…… |
尝试了一下,的确可以用嵌套判断语句来针对字体调整间距。最外层应该对最可能变化的 需要注意的是像 \documentclass{article}
\usepackage{xeCJK} % loads fontspec internally
\setmainfont{TeX Gyre Schola}
\setsansfont{TeX Gyre Adventor}
\setmonofont{TeX Gyre Cursor}
\makeatletter
\def\setCJKecglue@nnn#1#2#3{%
\xeCJKsetup
{ xCJKecglue = {\hskip #1em plus #2em minus #3em\relax} }%
}
\newcommand*\setCJKecglue{%
\ifnum\strcmp{\f@family}{\rmdefault}=0 %
\ifnum\strcmp{\f@series}{\mddefault}=0 %
\ifnum\strcmp{\f@shape}{\updefault}=0 %
\setCJKecglue@nnn{0.09}{0.045}{0.03}%
\else
\setCJKecglue@nnn{0.5}{0.25}{0.167}%
\fi
\else
\ifnum\strcmp{\f@shape}{\updefault}=0 %
\setCJKecglue@nnn{1}{0.5}{0.333}%
\else
\setCJKecglue@nnn{1.5}{0.75}{0.5}%
\fi
\fi
\else
\ifnum\strcmp{\f@family}{\sfdefault}=0 %
\ifnum\strcmp{\f@series}{\mddefault}=0 %
\setCJKecglue@nnn{0.6}{0.3}{0.2}%
\else
\setCJKecglue@nnn{0.9}{0.45}{0.3}%
\fi
\else
\setCJKecglue@nnn{0.2}{0.1}{0.067}%
\fi
\fi
}
\makeatother
\usepackage{everysel}
\EverySelectfont{\setCJKecglue}
\newcommand\test{%
\begin{tabular}{llll}
第1章 & \itshape 第1章 & \bfseries 第1章 & \bfseries\itshape 第1章 \\
第 1 章 & \itshape 第 1 章 & \bfseries 第 1 章 & \bfseries\itshape 第 1 章 \\
\end{tabular}%
}
\newcommand*\figref[1]{%
图\nobreak\CJKecglue\ref{#1}\CJKecglue\ignorespaces
}
\newcommand*\figrefatend[1]{%
图\nobreak\CJKecglue\ref{#1}\ignorespaces
}
\begin{document}
\LARGE \test\par
\sffamily \test\par
\ttfamily \test\par
\rmfamily
\begin{figure}
\caption{A figure to be referenced.}\label{fig:example}
\end{figure}
Type ``1'': Figure~1 shows that\dots\par
图~1 展示了……(unbalanced spaces)\par
图\nobreak\CJKecglue1 展示了……(balanced spaces)\par
Use labels: Figure~\ref{fig:example} shows that\dots\par
图~\ref{fig:example} 展示了……(Latin spaces)\par
\figref{fig:example} 展示了……(correct spaces)\par
See Figure~\ref{fig:example}.\par
见\figref{fig:example}。(wrong space before full stop)\par
见 \figrefatend{fig:example} 。(no space before full stop)
\end{document} |
发现 @qinglee 之前的思路有疏漏之处: \documentclass{article}% ctexart 行为一致
\usepackage{xeCJK}
\makeatletter
\newcommand*\setCJKecglue{%
\ifnum\strcmp{\f@family}{\rmdefault}=0 %
\xeCJKsetup{xCJKecglue={\hskip1em\relax}}%
\else
\ifnum\strcmp{\f@family}{\sfdefault}=0 %
\xeCJKsetup{xCJKecglue={\hskip4em\relax}}%
\else
\xeCJKsetup{xCJKecglue={\hskip10em\relax}}%
\fi
\fi
}
\makeatother
\usepackage{everysel}
\EverySelectfont{\setCJKecglue}
\begin{document}
中文English中文\par 中文 English 中文\par
中文\textrm{English}中文\par 中文 \textrm{English} 中文\par
中文\textsf{English}中文\par 中文 \textsf{English} 中文\par
中文\texttt{English}中文\par 中文 \texttt{English} 中文\par
\normalsize
中文English中文\par 中文 English 中文\par
中文\textrm{English}中文\par 中文 \textrm{English} 中文\par
中文\textsf{English}中文\par 中文 \textsf{English} 中文\par
中文\texttt{English}中文\par 中文 \texttt{English} 中文\par
\end{document} 问题如下:
|
检查
描述问题
通过
xeCJK
宏包提供的xCJKecglue
选项,我们可以调整中西文之间空格的大小。美中不足的是,这个值通用于罗马(衬线)字族与无衬线字族的全部字体。我希望能够调整xCJKecglue
的值,使得xCJKecglue + 数字宽 + xCJKecglue
占一个汉字宽,这样第一章
与第 1 章
就可以占据同样多的位置(不论是正体、意大利斜体,还是衬线、无衬线)。或许可以通过 NFSS 的某个钩子执行自定义的\xeCJKsetup{ xCJKecglue = <glue> }
?最小工作示例(MWE)
(用 XeLaTeX 编译后)输出
链接
The text was updated successfully, but these errors were encountered: