如题,想做一个练习册,里面有填空题,编译结果是这样的:
\hrule
命令生成受限水平盒子无法换行,所以,第(1)题超出左栏栏宽的答题线,必须能够换行,但是我总不能每次都去数还有几个字的水平距离够我使用,所以这件事需要TeX帮我完成;\hrule
不能换行导致前后行中字数过少,所以两端对齐条件下文字间距变得松散,极不美观,所以希望上下两行的能够换行的答题线长度之和是定值,暂定为9em,考虑到通用性,希望可以指定任意合理的长度;\documentclass[UTF8]{ctexart}%pdflatex编译
\usepackage[showframe,margin=1in]{geometry}
\usepackage{enumitem}
\setlist[enumerate]{nosep,labelsep=0pt,leftmargin=2em}
\usepackage{multicol}
\setlength{\columnseprule}{.4pt}
\setlength{\columnsep}{1cm}
\begin{document}
\noindent\textbf{16. }补写出下列句子中的空缺部分。(6分)
\begin{multicols}{2}
\begin{enumerate}[label=(\arabic{enumi})]
\item
王湾《次北固山下》的名句“\rule{9em}{.4pt},\rule{9em}{.4pt}”,描写时序交替中的景物,暗示着时光流逝,蕴含着自然理趣。
\item
小慧为朋友家的农家乐餐厅写宣传横幅,直接使用了陆游《游山西村》里的“\rule{9em}{.4pt},\rule{9em}{.4pt}”两句诗,朋友看了觉得很贴切。
\item
行至群山深处,见到一挂瀑布飞泻而下,水石激荡,轰鸣作响,于老师回头对学生们说:“这不就是古诗中写的‘\rule{9em}{.4pt},\rule{9em}{.4pt}’嘛!”
\end{enumerate}
\end{multicols}
\noindent\textbf{参考答案:}
\begin{enumerate}[label=(\arabic{enumi})]
\item
海日生残夜\quad 江春入旧年
\item
山重水复疑无路\quad 柳暗花明又一村
\item
飞流直下三千尺\quad 疑是银河落九天(飞湍瀑流争喧豗\quad 砯崖转石万壑雷)
\end{enumerate}
\end{document}
\documentclass[UTF8]{ctexart}%pdflatex编译
\usepackage[showframe,margin=1in]{geometry}
\usepackage{enumitem}
\setlist[enumerate]{nosep,labelsep=0pt,leftmargin=2em}
\usepackage{multicol}
\setlength{\columnseprule}{.4pt}
\setlength{\columnsep}{1cm}
\makeatletter
\newcommand\brule[3][\z@]{\leavevmode
{\setlength\@tempdima{#2}\setlength\@tempdimb{#1}\setlength\@tempdimc{#3}%
\@tempcnta=\fpeval{ceil(\@tempdima/5pt)}
\kern\z@
\loop\ifnum\@tempcnta>\z@
\vrule \@width 5pt \@height \@tempdimc \@depth -\@tempdimb \hskip\z@skip
\advance\@tempcnta\m@ne
\repeat \unskip
}}
\makeatother
\begin{document}
\noindent\textbf{16. }补写出下列句子中的空缺部分。(6分)
\begin{multicols}{2}
\begin{enumerate}[label=(\arabic{enumi})]
\item
王湾《次北固山下》的名句“\brule{9em}{.4pt},\brule{9em}{.4pt}”,描写时序交替中的景物,暗示着时光流逝,蕴含着自然理趣。
\item
小慧为朋友家的农家乐餐厅写宣传横幅,直接使用了陆游《游山西村》里的“\brule{9em}{.4pt},\brule{9em}{.4pt}”两句诗,朋友看了觉得很贴切。
\item
行至群山深处,见到一挂瀑布飞泻而下,水石激荡,轰鸣作响,于老师回头对学生们说:“这不就是古诗中写的‘\brule{9em}{.4pt},\brule{9em}{.4pt}’嘛!”
\end{enumerate}
\end{multicols}
\noindent\textbf{参考答案:}
\begin{enumerate}[label=(\arabic{enumi})]
\item
海日生残夜\quad 江春入旧年
\item
山重水复疑无路\quad 柳暗花明又一村
\item
飞流直下三千尺\quad 疑是银河落九天(飞湍瀑流争喧豗\quad 砯崖转石万壑雷)
\end{enumerate}
\end{document}
尝试拜读了一下(★ ω ★):
想顺便再问个小问题:
\kern\z@
,\hskip\z@skip
以及\unskip
的作用可否做下解释,虽然我能搜到他们各自的含义是『长度为0的间距』,『参数为0pt plust0pt minus0pt
的水平skip』以及『\unskip
如果当前列上的最后一项是一个glue,就去掉他』但在这个具体例子里的作用还是相对有点迷惑的。谢谢雾月老师~@u70550 xeCJKfntef、xsim 等宏包都有类似的实现,不管它们相对比较复杂,或许 https://tex.stackexchange.com/ 上也有。
\kern\z@
是为了阻止\unskip
移除 rule 之前的 glue,我这里是偷懒了,实际可以判断一下。\hskip\z@skip
是为了创建可断点,如果没有这个,同样不可能断行。其它能创建可断点的也行,比如\penalty\z@
。\unskip
移除最后一个\hskip
避免创建不需要的可断点。\loop
不是原语。@u10307 感谢您,
\loop...\repeat
在texbook的20章有,刚才下意识以为是了(逃,已修改)关键点在于
\hskip\z@skip
,再次感谢您的指导!