Choice of processor

Joseph Wright joseph at texdev.net
Wed Mar 5 12:50:42 CET 2025


On 05/03/2025 11:24, David Carlisle wrote:
> On Wed, 5 Mar 2025 at 11:07, Philip Taylor <P.Taylor at hellenic-institute.uk>
> wrote:
>
>> OK, adding "\input luaotfload.sty" appears to allow access to some (but
>> not yet all) system fonts (LuaTeX states that it cannot find "Avenir LT Std
>> 45 Book")
>>
>> luaotfload | db : Reload initiated (formats: otf,ttf,ttc); reason: Font
>> "Avenir LT Std 45 Book" not found.
>>
>> luaotfload | resolve : sequence of 3 lookups yielded nothing appropriate.
>>
>> ! Font \mlfont=Avenir LT Std 45 Book at 6pt not loadable: metric data not
>> found
>>
>> or bad.
>>
>> l.66 \font \mlfont = "Avenir LT Std 45 Book" at 6 pt
>>
>> — the reason for that remains to be investigated.  However, I now have
>> another problem.  I make frequent use of XeTeX's \strcmp primitive — is
>> there a LuaTeX equivalent ?
>>
>
> LaTeX has been providing a strcmp implementation in Lua for decades so for
> the vast majority of users such issues (the point of the thread started by
> Peter) simply don't exist. If you choose to use plain tex and ignore
> decades of development by other people that's fine but you then need to
> actually do the work of doing those implementations, but to give you a
> start latex uses
>
>   \begin{macro}[no-user-doc]{\tex_strcmp:D}
> %   Compare two strings, expanding to |0| if they are equal,
> %   |-1| if the first one is smaller and |1| if the second one is smaller.
> %   Here \enquote{smaller} refers to codepoint order which does not
> correspond to
> %   the user expected order for most non-ASCII strings.
> %    \begin{macrocode}
> local minus_tok = token_new(string.byte'-', 12)
> local zero_tok = token_new(string.byte'0', 12)
> local one_tok = token_new(string.byte'1', 12)
> luacmd('tex_strcmp:D', function()
>    local first = scan_string()
>    local second = scan_string()
>    if first < second then
>      put_next(minus_tok, one_tok)
>    else
>      put_next(first == second and zero_tok or one_tok)
>    end
> end, 'global')
> %    \end{macrocode}
> % \end{macro}
>
> You might want to call it \strcmp rather than \tex_strcmp:D but otherwise
> it should work put it inside \directlua{...}


The above relies on various other bits of Lua as LaTeX does various bits
of emulation and tracks things. For a one-off use, you could go with

\directlua{
   local t = lua.get_functions_table()
   local minus_tok = token.new(string.byte('-'), 12)
   local zero_tok = token.new(string.byte('0'), 12)
   local one_tok = token.new(string.byte('1'), 12)
   t[1] = function()
     local first = token.scan_string()
     local second = token.scan_string()
     if first < second then
       token.put_next(minus_tok, one_tok)
     else
       token.put_next(first == second and zero_tok or one_tok)
     end
   end
}
\luadef\strcmp 1 %
\strcmp{A}{A}
\strcmp{A}{B}
\strcmp{B}{A}
\bye

which hard-codes that we are using a known Lua function - done like
this, \strcmp has the same behaviour as a primitive.

Joseph



More information about the texhax mailing list.