DMDX Help.
Instruction Keyword
<Instruction N1,N2,N3
[options]>
<inst N1,N2,N3
[options]>
variants:
<Instruction command>
<inst command>
options:
right2left
hardmargin
commands:
newline
nl
escape
esc
nowrap
Switch and parameter (as of 5.3.1.6) to turn on automatic formatting so people don't have to guess where line breaks in paragraphs of text should occur.
When <inst> is used as a parameter only the
options have any effect and when used
they set that option globally for the whole item file (there is no way to
override them once invoked in the parameters).
N1,N2,N3
specify the left, top and right coordinates of a bounding rectangle on the screen in the same fashion as other on screen rectangles are defined in DMDX (see
<graphic>) with the exception that the bottom coordinate (if specified) will be ignored. Words in an item that this keyword occurs in (note there's no correlation between item number zero instructions and the
<inst> keyword although they are likely to both be used in the same item) are specified in a word per frame sequence "like ", "this ", "where ", "each ", "word ", "is ", "frame ", "delimited " with a following space and DMDX automatically starts positioning frames at
N1,N2
and adds the width of the previous frames across the screen and inserts line breaks when the word crosses the right coordinate
(N3)
or in the case of the hardmargin option (as of
version 5.3.1.4) being used the new line comes before the word crosses the right
coordinate. The newline
(nl) command forces a new line at the end of the frame they occur in
(so the next frame will be drawn at the left edge of the bounding rectangle) and
the escape (esc)
command escapes the
frame it occurs in from <inst>
positioning allowing
<xy> for example to be used.
The nowrap command added in version 6.1.6.0 of
DMDX is not intended for experimenters to use (if you don't want something to
wrap keep it all in one frame), instead it is provided for internal use with the
<prose> keyword (it's used to
stop the cursor wrapping to the next line ahead where the subject is typing).
The right2left option is for use
with fonts like Hebrew where words start at the right margin and progress
leftwards (use of
<XYJustification RIGHTTOP>
being all but mandatory, see note below). The right2left
option also makes changes to the way
<prose> operates, reversing the right
and left arrows and making the text it emits contain \rtlch RTF control codes
(the latter being necessary to get the punctuation marks on the left of the
words). If <inst
right2left> has been
used in the parameters it also affects the
progressive X keyword.
While this format looks intimidating it's actually pretty
easy to use as all you have to do is type your instructions normally and then in
Word for instance you can highlight that section and then replace all the spaces
in that section with [space]",[space]" and not let it then continue on replacing
all the spaces in the rest of the file -- you will probably want to go back and
replace double space leadins to full stops (should you use them) as those single
space frames can wind up being the first frame on a new line and thus be
indented a bit which doesn't look good
The difference between using the hardmargin
option and not is subtle but significant. Without it you have to set your
right margin far enough to the left that the longest word in your instructions
won't extend beyond the right edge of the screen and there are times this can be
difficult to do whereas using hardmargin you're
going to set your right margin much closer to the right edge of the screen and
not have to worry about a word ever getting close to the right edge of the
screen unless it's as wide as the whole screen and that's pretty easy to guard
against. I don't see a reason not to use it, the only reason it's not the
default is that I must leave DMDX operating the way it did in the past so as to
not break people's old item files.
<XYJustification
LEFTBOTTOM> is a useful keyword to use with <inst>
if more than one font or bitmaps are to be included in the item as it will line up the bottoms of the frames up instead of the tops as the default justification would (you'll want to make sure the top coordinate is a bit lower on the screen as that will be the bottom of the first line of instructions). Note that in order to get the base lines of the fonts to line up you're probably going to have to include spaces in the smaller font frames that are in the larger font size. Large bitmaps might be kind of entertaining but hey.
Also, note that while
<XYJustification
LEFTBOTTOM> and
<XYJustification LEFTTOP> work with
<inst> <XYJustification CENTER> is
positively toxic (same probably goes for
<XYJustification RIGHTBOTTOM> unless you're using a right to left
font). So if you're using
<XYJustification CENTER> to position bitmaps nicely you're going to have
to toggle back to
<XYJustification LEFTTOP> or
<XYJustification
LEFTBOTTOM> for
<inst> use. And then of course
if you're using
<inst esc> to position bitmaps
then you'll have to be doing that toggling in the item from frame to frame as
conditions change -- except of course that <xyjustification>
was a global per item attribute and you couldn't change it multiple times per item
(only the last one will be used) until I rectified that in version
5.2.1.2. You'll have to turn on the frame by frame MDSP option with
<xyjustification framebyframe> but having
done so you can have item files like this that display a centered image for the
subject to type about:
f1 <vm desktop> <id
keyboard> <nfb> <cr> <xyjustification framebyframe>
~77 ma++ mb++ mc++ md++ <mpr
+enter>;
+1 <inst .2,.5,.82 hardmargin> <delay 2> <inst esc> <xyjustification center> <xy
.5,.25> <bmp> "DMDXICO.BMP" , <xyjustification lefttop> "Please type the name:
", <ln 3> ~c, "|", ~d <prose a,b,c,d> <mwb +enter,77 bu,-1>;
~77 etc... ;
Note that while the coordinates are all technically optional you're really going to need to specify the right
N3
coordinate otherwise words will be truncated by the edge of the screen.
Also note that once the coordinate specifying form of this keyword occurs in an
item it's active for the whole item, there's no way to have two different
rectangles of text in one item and it is only possible to have a frame not subject to <inst>'s formatting
by including <inst esc>
in it. Even if the <inst>
is in the last frame of the item all frames before it not escaped will still be affected. And
you really shouldn't be using things like feedback or more specifically
<ZillionTypedResponses>
to gather responses as
<inst>
will be interfering with all that text formatting
too (although the
<prose>
keyword used above is designed to work with <inst>). If you need to combine them do so in separate items and continue from
the first to the second and have the second not erase the screen from the first
item (along with the usual
<fbocb>
to not erase stuff as typing is happening and
so on):
<ep> <vm desktop> <zil> <ztr> <ntl>
<cr> <fbocb> <eop>
0 <inst .1,.1,.92 hardmargin> "complicated ", "instructions ", "for ", "typing ", "in ", "the ", "following
", "item" c;
+1 ! "Type:" * ;
There are several rather unobvious
features to using right to left fonts in DMDX. prior to version 4.3.0.0 While the GDI portion of
Windows that actually renders text in DMDX is aware of right to left fonts and
will reverse the letter order so the display renders correctly it can only do
that for individual requests and when there are font changes or formatting
changes DMDX must make multiple requests for a given frame to be rendered.
For example say the following was actually in a right to left font
"right to left" with no
formatting it's one request from DMDX and GDI will in fact render
"tfel ot htgir". However if
we say bold the "to" it's now three requests and in versions of DMDX
prior to 4.3.0.0 we'd get "htgir
ot tfel". Worse, when you go back and edit
something in Word even though the formatting is uniform across the string Word
will render it in two sections so DMDX's rendering would be faulty.
To save the end user from these problems I modified DMDX in version 4.3.0.0 to parse the right to left codes in the RTF and so
on. Prior to that to get around this the
right2left option was added so the following can be used:
0 <xyjustification RIGHTTOP> <inst .08,.4,.9
hardmargin right2left>
"right ", "to
", " left";
Note that if
you edit either of those three words (in Word at least) the word will be
scrambled when DMDX renders it in versions prior to 4.3.0.0. The solution
in the past was to just retype the
word from scratch in one edit, these days you're just going to use a non-ancient
version of DMDX...
Should you be faced with having to make an
item file with copious amounts of instructions that works on both a 16:9 widescreen display and 4:3 standard displays
as I was when I was crafting the introduction you can detect which display you're
running on
using the VideoModeX and
VideoModeY tokens added in
version 5.3.1.2 in the
counter expression evaluator and use a
larger or smaller bounding rectangle with the help of a macro or two (one is all
that's needed but for clarity I use two here):
~1 mx+.1+
my+.15+ <bi 3, ((videomodex * 10) / videomodey) .GT. 14>;
~1 mx+.02+ my+.07+; ! use more of the screen when 4:3;
~3 <dfm .8>;
0 <inst ~x, ~y, .92
hardmargin>
<xyjustification leftbottom>
"Lorem ", "ipsum
", "dolor ", "sit ", "amet, ", "ne ", "ubique ", "ridens ", "voluptaria ", "his,
", "in ", "augue ", "debet ", "facilisi ", "duo. ", "Oratio ", "assentior ",
"sea ", "no, ", "eu ", "docendi ", "fastidii ", "iudicabit ", "mei. ", "Suas ",
"rationibus ", "efficiendi ", "in ", "mei. ", "Vel ", "sonet ", "elitr ", "deleniti
", "an.", <inst nl>, <inst nl>,
"Lorem ", "ipsum
", "dolor ", "sit ", "amet, ", "ne ", "ubique ", "ridens ", "voluptaria ", "his,
", "in ", "augue ", "debet ", "facilisi ", "duo. ", "Oratio ", "assentior ",
"sea ", "no, ", "eu ", "docendi ", "fastidii ", "iudicabit ", "mei. ", "Suas ",
"rationibus ", "efficiendi ", "in ", "mei. ", "Vel ", "sonet ", "elitr ", "deleniti
", "an.", <inst nl>, <inst nl>,
"Lorem ", "ipsum
", "dolor ", "sit ", "amet, ", "ne ", "ubique ", "ridens ", "voluptaria ", "his,
", "in ", "augue ", "debet ", "facilisi ", "duo. ", "Oratio ", "assentior ",
"sea ", "no, ", "eu ", "docendi ", "fastidii ", "iudicabit ", "mei. ", "Suas ",
"rationibus ", "efficiendi ", "in ", "mei. ", "Vel ", "sonet ", "elitr ", "deleniti
", "an.", <inst nl>, <inst nl>,
"Lorem ", "ipsum
", "dolor ", "sit ", "amet, ", "ne ", "ubique ", "ridens ", "voluptaria ", "his,
", "in ", "augue ", "debet ", "facilisi ", "duo. ", "Oratio ", "assentior ",
"sea ", "no, ", "eu ", "docendi ", "fastidii ", "iudicabit ", "mei. ", "Suas ",
"rationibus ", "efficiendi ", "in ", "mei. ", "Vel ", "sonet ", "elitr ", "deleniti
", "an.", <inst nl>, <inst nl>,
<inst esc> "Hit the space bar to continue..." @12;
DMDX Index.