所以遗憾的是,我对 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}