LaTeX XY 定位

LaTeX XY 定位

我已经有一段时间没有使用乳胶了,我想尝试实施 Jean Luc Doumont 在 TUG 会议期间在此视频中给出的提示和技巧:http://www.youtube.com/watch?v=vkBCeOBbAmM

我尝试实现第一个技巧:xy定位

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\begin{document}

\def\xy#1#2#3{\setbox0=\hbox to\z@{%
\kern#1\raise#2\hbox{#3}\hss}%
\ht0=\z@\dp0=\z@\box0}


%testing the command
\xy 1 5 b


\end{document}

不幸的是我收到以下错误日志

! Undefined control sequence.
\xy #1#2#3->\setbox 0=\hbox to\z 
                                 @{\kern #1\raise #2\hbox {#3}\hss }\ht 0=\z...
l.29 \xy 1 5 b

The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

! Missing number, treated as zero.
<to be read again> 
                   @
l.29 \xy 1 5 b

A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)

! Illegal unit of measure (pt inserted).
<to be read again> 
                   @
l.29 \xy 1 5 b

Dimensions can be in units of em, ex, in, pt, pc,
cm, mm, dd, cc, nd, nc, bp, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)

! Missing { inserted.
<to be read again> 
                   @
l.29 \xy 1 5 b

A left brace was mandatory here, so I've put one in.
You might want to delete and/or insert some corrections
so that I will find a matching right brace soon.
(If you're confused by all this, try typing `I}' now.)

! Illegal unit of measure (pt inserted).
<to be read again> 
                   \raise 
l.29 \xy 1 5 b

Dimensions can be in units of em, ex, in, pt, pc,
cm, mm, dd, cc, nd, nc, bp, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)

! Illegal unit of measure (pt inserted).
<to be read again> 
                   \hbox 
l.29 \xy 1 5 b

Dimensions can be in units of em, ex, in, pt, pc,
cm, mm, dd, cc, nd, nc, bp, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)

! Undefined control sequence.
\xy ...{\kern #1\raise #2\hbox {#3}\hss }\ht 0=\z 
                                                  @\dp 0=\z @\box 0
l.29 \xy 1 5 b

The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

! Missing number, treated as zero.
<to be read again> 
                   @
l.29 \xy 1 5 b

A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)

! Illegal unit of measure (pt inserted).
<to be read again> 
                   @
l.29 \xy 1 5 b

Dimensions can be in units of em, ex, in, pt, pc,
cm, mm, dd, cc, nd, nc, bp, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)

! Undefined control sequence.
\xy ...raise #2\hbox {#3}\hss }\ht 0=\z @\dp 0=\z 
                                                  @\box 0
l.29 \xy 1 5 b

The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

! Missing number, treated as zero.
<to be read again> 
                   @
l.29 \xy 1 5 b

A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)

! Illegal unit of measure (pt inserted).
<to be read again> 
                   @
l.29 \xy 1 5 b

Dimensions can be in units of em, ex, in, pt, pc,
cm, mm, dd, cc, nd, nc, bp, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)

! Missing } inserted.
<inserted text> 
                }
l.32 \end{document}

由于我之前从未编写过宏,所以我无法弄清楚错误是什么。

答案1

您需要将定义 pf 括\xy在 内\makeatletter\makeatother因为@字符(参见\makeatletter 和 \makeatother 起什么作用?); 此外,以 ots 的当前形式,第一个和第二个参数应该是长度(数字加上有效单位),而不仅仅是数字:

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\begin{document}

\makeatletter
\def\xy#1#2#3{\setbox0=\hbox to\z@{%
\kern#1\raise#2\hbox{#3}\hss}%
\ht0=\z@\dp0=\z@\box0}
\makeatother

%testing the command
\xy{1cm}{-5cm}{b}


\end{document}

如果你希望前两个参数是数字而不是长度,你可以这样说(如敲击在评论中建议):

\makeatletter
\def\xy#1#2#3{{\setbox0=\hbox to\z@{%
\kern#1\p@\raise#2\p@\hbox{#3}\hss}%
\ht0=\z@\dp0=\z@\box0}}
\makeatother

(单位为现在pt),然后\xy以形式使用

\xy{10}{-70}{b}

还要注意括住定义的括号;这种分组将避免在其他宏中使用时可能出现的问题(建议海科·奥伯迪克)。

相关内容