[pstricks] programming style of simple macro

Patrick Drechsler patrick at pdrechsler.de
Wed Oct 24 00:06:21 CEST 2007

Herbert Voss <Herbert.Voss at fu-berlin.de> writes:

> Patrick Drechsler schrieb:
>>> \define at key[psset]{pst-new}{offset}{\pst at getlength{#1}\PstWall at offset}%
>>> \define at key[psset]{pst-new}{thickness}{\pst at getlength{#1}\PstWall at thickness}%
>>> \define at key[psset]{pst-new}{MyWidth}{\pst at getlength{#1}\PstWall at MyWidth}%
> all "lengths" are saved as a value without a unit, it is by default
> pt and can be used directly inside PS code.

I see. That's why I was just lucky with my original "\edef" approach:

\define at key[psset]{pst-new}{offset}{\edef\PstWall at offset{#1}}%

I can now see why "\edef" is used for "strings", not "dims". 

On a side note: Understanding the difference between "\edef" and
"\def" will take up a lot of time, which is why I will postpone that

>>> \def\PstWall{\pst at object{PstWall}}%read star/options, continue with @i
>>> \def\PstWall at i(#1)#2{{%
>>>   \pst at killglue
>>>   \addbefore at par{linewidth=4pt}% allows overwriting by the user
>>>   \use at par%				 set options
>>>   \rput{\PstWall at MyAngle}(#1){%
>>>     \psset{unit=1pt}%		     local setting
>> Why is this line not necessary when using objects such as
>> open/closed/special/alt?
> you are on TeX level, the reason why you have to tell TeX, that
> we have all lengths as pt. When writing a macro on low level,
> then you can use these lengths directly.

Understood. Is there a reason *not* to use a macro
open/closed/special/alt to avoid this problem? In other words: Would I
not be on the save side always using one of these macros?

>>>     \ifx#2\pst at empty\else
>> What is the difference between "\pst at empty" and "\empty"?
> we know, what \pst at empty is, but we do not really know,
> if \empty is the same. A user may have redefined it. It is only
> safe to use PSTricks macros.

I just skimmed the documented pstricks code you mention below. I guess
I must make a list of TeX <commands> which are replaced by
pst@<commands>. Obviously I cannot assume that every command has been
ported (i.e. there is no "\pst at ifx" or "\pst at else" in the line above).

>>>         \PstWall at thickness .5 mul \pst at number\pslinewidth add
>> I figure that "\pst at number" converts a dimension/length to an
>> integer. Is this correct? What other commands are there for conversion
>> (i.e. int2length)?
> \pst at number converts every length with a unit (a dimen) into
> an integer (strips the unit), the value then refers to pt.

OK. Before asking if there is something like "\pst at ConvertNumberToDim"
I will look it up in the commented pstricks code (see comments below).

> \documentclass{article}
> \usepackage{pstricks}
> \begin{document}
> \makeatletter
> \pst at dima=10cm
> \pst at number\pst at dima
> \end{document}
> the output is the value of the length 10cm in pt.

Very instructive, thank you!

>> Is something like this covered in detail in the current version of
>> your book? I only have the first edition, but I saw that the fourth
>> edition has twice as many pages. In the first edition these subjects
>> are covered too briefly for me to comprehend the full meaning.
> yes, there is now a bit more text

I have just ordered a copy of the current edition.

> The original documentation of the core of pstricks is here:
> ftp://ftp.tug.org/tex/PSTricks/pst-code.pdf

A first glance at pst-code.pdf answered further questions I have with
writing pstricks code. Thanks for the pointer. 

I am trying to write a package. Are there things I should be aware of
when using pst-xkey/xkeyval? Are there any tutorials on the usage of
xkeyval other than "texdoc xkeyval"?

Again, thank you very much! Your feedback is very much appreciated!


More information about the PSTricks mailing list