是否可以使用 \typein 简化这个交互式宏,以便它不使用辅助宏?

是否可以使用 \typein 简化这个交互式宏,以便它不使用辅助宏?

我想允许用户在编译时与文档进行交互,例如选择超链接的颜色。

为此,我创建了一个新的 if 并\typein像以下示例中那样使用:

\documentclass{article}
\usepackage[colorlinks]{hyperref} 
\newif\ifcllinks
\newcommand\cllink{}
\typein[\cllink]{Coloried links (true or false) ?}
\csname cllinks\cllink \endcsname
\ifcllinks
    \hypersetup{linkcolor=red,citecolor=blue,filecolor=green,urlcolor=blue}
\else
    \hypersetup{linkcolor=black,citecolor=black,filecolor=black,urlcolor=black}
\fi
\begin{document}
\section{Title}\label{one}
The section \ref{one}
\end{document}

这可行,但我并不满意,因为补充宏\cllink不是很必要(我认为)。

我尝试

\newif\ifcllinks
\csname cllinks\typein{Coloried links (true or false) ?} \endcsname

但这不起作用(missing \endcsname inserted)。

\expandafter是否可以通过一些 TeX hackery ( ,,\string...)使其工作?

答案1

不,这不可能实现。

的内容\csname ... \endcsname必须完全可扩展,否则会引发错误。但是,\typein进行分配并且分配不可扩展,但必须执行。没有 TeX 黑客可以改变这一点。

所以

\typein[\cllink]{Coloried links (true or false) ?}
\csname cllinks\cllink \endcsname

它尽可能小。

如果不希望宏定义成为全局的,则可以将其设为本地宏定义:

\begingroup
\typein[\cllink]{Coloried links (true or false) ?}
\expandafter
\endgroup
\csname cllinks\cllink \endcsname

但代码不会变得更短。

答案2

一个答案已经被接受了,但我还是要抛出我的答案:为什么坚持要求用户输入“true”或“false”?这里有一个变体,它将接受以小写“y”开头的任何答案作为肯定答案,其他任何答案都表示否定:

\documentclass{minimal}
\makeatletter
\def\ask#1{\typeout{#1}%
  \begingroup \endlinechar-1 \read-1 to\answer
  \expandafter\futurelet\expandafter\answer\expandafter\@ask\answer.\@nil}
\def\@ask#1\@nil
  {\ifx y\answer\expandafter\@ask@y\else\expandafter\@ask@n\fi}
\def\@ask@y#1#2{\endgroup#1}
\def\@ask@n#1#2{\endgroup#2}
\makeatother
% demo:
\ask{Answer yes or no:}{\message{[yes]}}{\message{[no]}}
\ask{And again:}{\message{[yes]}}{\message{[no]}}
\begin{document}
\end{document}

这个定义有点长,但这是一个提出是非问题的通用机制。对于你的应用程序,你可以将其用作

\ask{colored links?}
  {\hypersetup{linkcolor=red,citecolor=blue,filecolor=green,urlcolor=blue}}
  {\hypersetup{linkcolor=black,citecolor=black,filecolor=black,urlcolor=black}}

答案3

使用 shell-escape 你可以让“ \typein” 变得可扩展\@@input "|⟨command⟩"

假设具有类似 bash shell 的类 UNIX 系统。

仅用于学术目的,不适用于任何严肃用途。

\directlua当然,如果是 LuaTeX(实际上可以认真使用),也有简单的解决方案。

\documentclass{article}
\usepackage[colorlinks]{hyperref} 
\newif\ifcllinks

\makeatletter
\def\zap@one@space#1 {#1}
\begingroup\expandafter\endgroup\csname cllinks%
\expandafter\zap@one@space\@@input "|echo >&2;read -p 'Coloried links (true or false) ?';echo $REPLY"\endcsname
\makeatother

\ifcllinks
    \hypersetup{linkcolor=red,citecolor=blue,filecolor=green,urlcolor=blue}
\else
    \hypersetup{linkcolor=black,citecolor=black,filecolor=black,urlcolor=black}
\fi
\begin{document}
\section{Title}\label{one}
The section \ref{one}
\end{document}

需要zap@one@space来删除被标记为空格的尾随换行符(假设\endlinechar=13\catcode 13=5)。只是为了方便在用户输入或\begingroup\expandafter\endgroup以外的内容时引发错误。truefalse

相关内容