\typein 和用户友好性:如何防止用户按下箭头键或删除时发生错误?

\typein 和用户友好性:如何防止用户按下箭头键或删除时发生错误?

我正在为我的朋友 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 所用的标准行编辑操作(箭头、退格或删除)。

相关内容