我想允许用户在编译时与文档进行交互,例如选择超链接的颜色。
为此,我创建了一个新的 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
以外的内容时引发错误。true
false