我正在为我的朋友 Galahad 爵士编写一份文档,并使用\typein
它对其进行定制:我会给他文件bridge.tex
,他将运行pdflatex bridge.tex
,在编译过程中终端会问他几个问题,并根据他的回答修改文档。
当 Galahad 编写这份文档时,我不在场,所以我想让它更加“用户友好”,即它不应该难以使用并且可以原谅错误。
具体来说,问题是:如果用户想要编辑他们的输入,删除键和箭头键会导致错误。有办法防止这种情况吗?不过,退格键可以正常工作。
以下是正在发生的情况的一个例子。
% bridge.tex
\documentclass{beamer}
\begin{document}
\typein[\yourname]{What... is your name?}
\typein[\yourquest]{What... is your quest?}
\typein[\yourcolor]{And what... is your favorite colour?}
\begin{frame}{Sir \yourname{} of Camelot}
\begin{itemize}
\item Name: \yourname
\item Quest: \yourquest
\item Favorite colour: \yourcolor
\end{itemize}
\end{frame}
\end{document}
加拉哈德爵士编译了这个,一切都很顺利,直到第三个问题:他首先写下“蓝色”,但是当他尝试使用左箭头键将其编辑为“黄色”时,它没有按预期工作:
What... is your name?
\yourname=Sir Galahad
What... is your quest?
\yourquest=To seek the Grail
And what... is your favorite colour?
\yourcolor=Blue!^[[D^[[D^[[D^[[D
每次按下左箭头键时,^[[D
都会插入,并将其传递给 LaTeX,在那里会导致错误。Text line contains invalid character.
删除键也会发生类似的问题。
是否有允许 Sir Galahad 使用这些密钥的标志?如果没有,我可以编写一个\typein
可行的解决方法吗?如果有必要,我愿意使用\write18
。
答案1
默认情况下,TeX 程序在回答提示时仅接受退格键作为行编辑的基本方法,无论是由提示引起的\typein
(通过从非开放流读取实现)还是由错误消息引起的。
实现者可能决定将程序链接到readline
类型库,但据我所知,目前没有任何实现可以做到这一点,因为它会引入太多依赖关系。
前端可能允许在提示符下进行行编辑输入;我检查了 TeXworks 和 TeXShop,它们确实允许。当然,前端应该设置为调用 TeX 的交互式运行(大多数-interaction=nonstopmode
默认使用该选项调用引擎)。
如果 Galahad 爵士在 Unix 系统上从命令行运行 TeX(或任何其他排版引擎),您可以为他安装该实用程序rlwrap
这样他就可以在 TeX 调用前加上前缀rlwrap
:
rlwrap pdflatex bridge
将允许 Sir Galahad 使用他对 shell 所用的标准行编辑操作(箭头、退格或删除)。