如何“教导”自定义命令来设置规则同时使用换行符?

如何“教导”自定义命令来设置规则同时使用换行符?

所以遗憾的是,我对 TeX 的熟悉程度还不如我希望的那样。我正在寻找有关创建自定义命令的指导。到目前为止,我一直在手动执行此操作,但我想迈出一步。

我试图创建的命令类似于,它会为\blank{anyword}我创建一个长度为单词 1.5 倍的下划线。这样,当我打印该文档时,我就可以让我的学生填写空白。我现在遇到的唯一问题是,该命令完全忽略了换行符,我不知道如何解决。在像疯子一样谷歌搜索后,我想可能没有解决方案。

我将发布一个最小工作示例来展示该问题。这是我目前使用的,尽管这可能不是最简单的解决方案:

\documentclass[a4paper,12pt]{article}
\usepackage{calc}
\newcommand{\gap}[1]{\rule{\widthof{#1}*\real{1.5}}{0.15mm}}

\begin{document}
    \setlength{\parindent}{0pt}
    
    anyword
    \vspace*{10mm}\\
    \gap{anyword}
    \vspace*{10mm}\\
    \textbf{Currently:}
    
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam \gap{nonumy-eirmod} tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    \vspace*{10mm}\\
    \textbf{How the Goal looks like:}
    
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam \gap{nonumy} \gap{eirmod} tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{document}

你有什么见解吗?我希望代码自动执行命令\rule直到结束\textwidth,然后在下一行文本中填补剩余的空白。

您知道如何实现这个目标吗?

答案1

在一个简单的调整中(请参阅下文以了解更好的方法),可以制作子段的下划线间隙,从而允许子段之间断开。在这里,我将下划线间隙分成 6 个段。

\documentclass[a4paper,12pt]{article}
\usepackage{calc}
\newcommand{\gap}[1]{%
  \rule{\widthof{#1}*\real{.25}}{0.15mm}\allowbreak%
  \rule{\widthof{#1}*\real{.25}}{0.15mm}\allowbreak%
  \rule{\widthof{#1}*\real{.25}}{0.15mm}\allowbreak%
  \rule{\widthof{#1}*\real{.25}}{0.15mm}\allowbreak%
  \rule{\widthof{#1}*\real{.25}}{0.15mm}\allowbreak%
  \rule{\widthof{#1}*\real{.25}}{0.15mm}%
}

\begin{document}
    \setlength{\parindent}{0pt}
    
    anyword
    \vspace*{10mm}\\
    \gap{anyword}
    \vspace*{10mm}\\
    \textbf{Currently:}

    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam \gap{nonumy-eirmod} tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    \vspace*{10mm}\\
    \textbf{How the Goal looks like:}
    
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam \gap{nonumy} \gap{eirmod} tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
\end{document}

在此处输入图片描述

推荐方法

进一步考虑这个想法,人们可以使用标记循环来为输入中的每个字符/空格标记设置一条规则,这样就可以对扩展文本段落进行正确的下划线。

\documentclass[a4paper,12pt]{article}
\usepackage{calc,tokcycle}
\newcommand{\gap}[1]{%
 \tokencycle
  {\rule{\widthof{##1}*\real{1.5}}{0.15mm}\hspace{0pt minus 2pt}}%
  {\processtoks{##1}}%
  {}%
  {\rule{\widthof{##1}*\real{1.5}}{0.15mm}\hspace{0pt minus 2pt}}%
  #1\endtokencycle
}

\begin{document}
    \setlength{\parindent}{0pt}
    
    anyword
    \vspace*{10mm}\\
    \gap{anyword}
    \vspace*{10mm}\\
    \textbf{Currently:}

    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed 
diam \gap{nonumy-eirmod} tempor invidunt ut labore et dolore 
magna aliquyam erat, sed diam voluptua.

    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed 
diam \gap{nonumy-eirmod nonumy-eirmod nonumy-eirmod nonumy-eirmod
nonumy-eirmod nonumy-eirmod nonumy-eirmod nonumy-eirmod
nonumy-eirmod nonumy-eirmod} tempor invidunt ut labore et dolore 
magna aliquyam erat, sed diam voluptua.

\end{document}

在此处输入图片描述

答案2

\gap命令将测试材料的宽度是否大于 3.5em。如果是,则生成 1.75em 宽的规则,然后生成尽可能多的非常短的规则 (3pt) 副本,以 (大约) 填充请求的间隙,后面跟着另一个 1.75em 宽的规则。

任何两个短规则之间都允许换行。

如果材料短于 3.5em,则会产生不可破坏的规则。

\documentclass{article}

\ExplSyntaxOn
\cs_new_eq:NN \replicate \prg_replicate:nn
\ExplSyntaxOff

\newlength{\gaplength}
\newcommand{\gap}[1]{%
  \settowidth{\gaplength}{#1}%
  \ifdim\gaplength<4em
    \leaders\hrule height -2pt depth 2.4pt\hskip\gaplength
  \else
    \splitgap
  \fi
}

\newcommand{\splitgap}{%
  \vrule height -2pt depth 2.4pt width 1.75em
  \replicate{%
    \fpeval{round((\gaplength-3.5em)/(3pt),0)}% how many times
  }{%
    \hbox to 3pt{\hss\vrule height -2pt depth 2.4pt width 3.1pt\hss}\penalty0
  }%
  \unpenalty
  \vrule height -2pt depth 2.4pt width 1.75em\relax
}

\begin{document}

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, 
sed diam nonumy-eirmod tempor invidunt ut labore et 
dolore magna aliquyam erat, sed diam voluptua.

Lorem ipsum dolor sit amet, \gap{consetetur} sadipscing elitr, 
sed diam \gap{nonumy-eirmod} tempor invidunt ut labore et 
dolore magna aliquyam erat, sed diam voluptua.

\end{document}

换行并不完全相同,因为“无间隙”版本依赖于单词的连字符,而这在该\gap版本中是不可能考虑到的(嗯,这需要非常大量的工作)。

在此处输入图片描述

答案3

您想重新发明吗dashundergaps

使用此包,间隙中会有换行符,但单词不会使用连字符。但是,使用,teach-mode您可以轻松控制某些间隙是否需要软连字符 ( \-)。

另一方面,可以使用较大的字体加上百分比增加额外的宽度来控制间隙的加宽。此百分比不是无限的(最大值约为 40% 或更少,很大程度上取决于间隙所用的字体),但作为补偿,还有其他有趣的选项。

例子:


姆韦


\documentclass[a4paper,12pt]{article}
\usepackage{geometry,lipsum}\parskip1em % for the mwe only
\usepackage[%
    %%%% teacher-mode=true, % to see hidden text
]{dashundergaps}


\begin{document}
    
\lipsum[1][1-4] % text reference

% Gap without widening nor numbers

{\dashundergapssetup{%
gap-font=\normalsize, % default \bfseries 
gap-widen=false,
gap-number-format={}}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \gap{vesti\-bulum} ut, placerat ac, adipiscing vitae, felis. \gap{Curabitur  dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer} id, vulputate a, magna.} 

% Default (widening for a bold font and numbers)  

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \gap{vesti\-bulum} ut, placerat ac, adipiscing vitae, felis. \gap{Curabitur  dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer} id, vulputate a, magna. 

% More widening and styles 

\dashundergapssetup{%
gap-widen=true,
gap-extend-percent=30, % default 20, maximum depends on the gap-font
gap-format=dash, 
gap-number-format= \textsuperscript{\tiny(\thegapnumber)}}    

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \gap{vesti\-bulum} ut, placerat ac, adipiscing vitae, felis. \gap[.]{Curabitur  dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer} id, vulputate a, magna. 

\dashundergapssetup{%
gap-font=\Huge,
gap-extend-percent=0} % oppss!!decrease it with huge fonts ...


Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, \gap[w]{vesti\-bulum} ut, placerat ac, adipiscing vitae, felis. \gap[d]{Cura\-bitur  dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer} id, vulputate a, magna. 


\end{document}

相关内容