20 结合 \tag 实现行间公式的 \dotfill 的方法?

发布于 2022-07-01 17:10:51

编译环境

  • 操作系统

    • [ ] Windows 10
    • [ ] Windows 8/8.1
    • [ ] Windows 7
    • [ ] 更早版本的 Windows
    • [x] macOS
    • [ ] Linux(请附发行版)
  • TeX 发行版

    • [x] TeX Live 2022
    • [ ] MiKTeX <!-- 版本号 -->
    • [ ] CTeX 套装 2.9.2.164
    • [ ] 更早版本的 CTeX 套装

描述问题

最小工作示例(MWE)

下面是MWE

\documentclass{ctexart}
\usepackage[a4paper]{geometry}
\usepackage{amsmath}


\makeatletter
\ExplSyntaxOn

\NewDocumentCommand { \score } { O{} m }
  {
    \mode_if_math:TF
      { \__examzh_cdotfill: \tag*{#2 \text{~分}} }
      { \__examzh_cdotfill: #2 分 }
    \mode_if_math:F
      {
        \par \noindent \ignorespaces
      }
  }
% 仿照 latex.ltx, line 651 的 \dotfill
\cs_new:Npn \__examzh_cdotfill:
  {
    \mode_leave_vertical:
    \cleaders \hb@xt@ .44em {\hss $\cdot$ \hss} \hfill
    \kern\z@
  }

\ExplSyntaxOff
\makeatother

\begin{document}

\begin{enumerate}
  \item 事实上,由于 $x_1 < 2$,且 $x_k < 2$ 时
  \[
    x_{k + 1} = \sqrt{2 + x_k} < \sqrt{2 + 2} = 2,
  \]
  由数学归纳法知对所有 $n$ 都有 $x_n < 2$,即数列有上界.\score{2}
  又由于
  \[
    \frac{x_{n + 1}}{x_n} = \sqrt{\frac{2}{x_n^2} + \frac{1}{x_n}} > \sqrt{\frac{2}{2^2} + \frac{1}{2}} = 1,\score{2}
  \]
  \begin{equation}
    \frac{x_{n + 1}}{x_n} = \sqrt{\frac{2}{x_n^2} + \frac{1}{x_n}} > \sqrt{\frac{2}{2^2} + \frac{1}{2}} = 1,\score{2}
  \end{equation}
  \begin{align}
    \frac{x_{n + 1}}{x_n} = \sqrt{\frac{2}{x_n^2} + \frac{1}{x_n}} > \sqrt{\frac{2}{2^2} + \frac{1}{2}} = 1,\score{2}
  \end{align}
  \begin{gather}
    \frac{x_{n + 1}}{x_n} = \sqrt{\frac{2}{x_n^2} + \frac{1}{x_n}} > \sqrt{\frac{2}{2^2} + \frac{1}{2}} = 1,\score{2}
  \end{gather}
  所以数列单调增加.由极限存在准则II,数列必定收敛.\score{2}
\end{enumerate}

\end{document}

效果如下:image.png

文本部分正常,但是数学模式的 \cdotfill 没有出现,也没有报错。

想请教一下有没有什么办法可以实现数学行间模式的引导线效果,不用 \tag 也行,只要能实现都可以

链接

查到一个 https://tex.stackexchange.com/questions/587933/equation-dotfill-between-index
但是他改了 \place@tag,这样的话 align 环境什么的也会被影响,而我想要的只是在使用 \score 的时候有 dotfill 效果,但不希望影响任何环境的原有效果。

我还做了这些尝试

我参考了 jnuexamsimplexam 但是它们的处理都是没有用 fill 类,而是用了两个 $\cdot$,我暂时没找到其它相关的。

查看更多

关注者
0
被浏览
1.4k
2 个回答
LaTeXStudio
LaTeXStudio 2022-07-02
这家伙很懒,什么也没写!

李清大神的方案:https://github.com/CTeX-org/forum/issues/256
可以用 zref-savepos 记录位置,然后手动填充,需要编译两次。

\documentclass{ctexart}
\usepackage[a4paper]{geometry}
\usepackage{amsmath}
\usepackage{zref-savepos}

\makeatletter
\ExplSyntaxOn

\zref@require@unique

\NewDocumentCommand { \score } { O{} m }
  {
    \mode_if_math:TF
      { \@@_math_cdotfill:n { #2 \text { ~ 分 } } }
      { \__examzh_cdotfill: #2 分 }
    \mode_if_math:F
      {
        \par \noindent \ignorespaces
      }
  }
% 仿照 latex.ltx, line 651 的 \dotfill
\cs_new:Npn \__examzh_cdotfill:
  {
    \mode_leave_vertical:
    \cleaders \hb@xt@ .44em {\hss $\cdot$ \hss} \hfill
    \kern\z@
  }

\cs_new_protected:Npn \@@_math_cdotfill:n #1
  {
    \stepcounter { zref@unique }
    \hbox_overlap_right:n
      {
        \zsaveposx { \thezref@unique L }
        \zref@ifrefundefined { \thezref@unique R }
          { }
          {
            \cleaders
              \hbox_to_wd:nn { .44em } { \hss $\cdot$ \hss }
              \skip_horizontal:n
                {
                    \zposx { \thezref@unique R } sp
                  - \zposx { \thezref@unique L } sp
                }
          }
      }
    \tag * { \zsaveposx { \thezref@unique R } #1 }
  }

\ExplSyntaxOff
\makeatother
小鬼
小鬼 2022-07-05
这家伙很懒,什么也没写!

参考《玩转latex》一书,第1.4.5节。

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览