다음 코드는 lualatex
(버전 베타-0.70.1-2011061410 (rev 4277))로 올바르게 컴파일될 수 있습니다. 하지만 \begin{luacode} ... \end{luacode}
환경을 사용하여 명령을 바꾸면 \luaexec{...}
오류가 발생합니다. 이것은 버그인가요?
! Extra }, or forgotten \endgroup.
<template> \unskip \hfil }
\hskip \tabcolsep \endtemplate
l.19 \end{luacode}
?
! Missing \endgroup inserted.
<inserted text>
\endgroup
l.19 \end{luacode}
?
! Missing } inserted.
<inserted text>
}
l.19 \end{luacode}
?
! LaTeX Error: \begin{tabular} on input line 8 ended by \end{luacode}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.19 \end{luacode}
? q
여기에 예가 있습니다
\documentclass[]{article}
\usepackage{luacode}
\usepackage[left=1cm,right=1cm]{geometry}
\begin{document}
\begin{center}
\begin{tabular}{lllllllll}
\luaexec{
num=6
for i=1,num do
for j=1,num do
ixj='$'..i..'\\times'..j..'='..i*j..'$';
tex.print(ixj)
if(j<num) then tex.sprint('&') else tex.sprint('\\\\') end
end
end
}
\end{tabular}
\end{center}
\end{document}
답변1
각 환경/매크로는 다릅니다. 각각은 특수 문자를 다르게 재정의합니다.
예를 들어, 코드 예제에서
\luaexec{
num=6
for i=1,num do
for j=1,num do
ixj='$'..i..'\\times'..j..'='..i*j..'$';
tex.print(ixj)
if(j<num) then tex.sprint('&') else tex.sprint('\\\\') end
end
end
}
너는 사용한다 \\
. 라텍스에는 \
특수 문자가 있습니다. Latex는 Lua가 그것을 볼 기회를 얻기 전에 Lua 코드 블록을 먼저 처리합니다. 이것이 의미하는 바는 다음과 같은 것이 있다면
\directlua{print('\n')}
라텍스는 그것을 분석하고 \
그것을 보고 뭔가를 하려고 노력할 것입니다. 라텍스 매크로인 경우 \n
확장을 시도합니다. 라텍스가 Lua 코드를 엉망으로 만드는 것을 방지하는 한 가지 방법은 다음과 같이 확장하지 말라고 지시하는 것입니다.
\directlua{print('\noexpand\n')}
이 경우 라텍스는 \noexpand
그 뒤에 있는 내용이 확장되지 않는 것을 볼 수 있습니다.
이제, 캣코드와 기타 특수 기호를 변경하면 \
라텍스가 루아 코드를 망가뜨리는 것을 막을 수 있습니다. 이것이 좋을 때도 있고 나쁠 때도 있습니다.
예를 들어
\newcommand{\mylatexmacro}{my text}
\directlua{print('\mylatexmacro')}
my text
라텍스가 팽창하므로 인쇄됩니다 \mylatexmacro
. 하지만 우리가 사용한다면
\newcommand{\mylatexmacro}{my text}
\luaexec{print('\mylatexmacro')}
?latexmacro
어디에 인쇄됩니까 ? 루아에 있는 것은 무엇이든 됩니다 \m
.
나는 모든 Lua 코드를 라텍스 코드와 별도로 유지하는 경향이 있습니다. 왜냐하면 일반적으로 Lua 코드에 들어가기 시작할 때 관련된 문제가 너무 많기 때문입니다. 매우 간단한 작업에서는 인라인 Lua 코드를 사용하지만 모든 기능은 라텍스 파일에 포함된 별도의 Lua 파일에 코딩합니다.
본질적으로 문제는 lualatex가 tex 파일을 전처리하지 않고 단순히 latex에 연결된 lua 인터프리터를 제공한다는 것입니다. 라텍스의 루아 코드는 실제로는 루아 인터프리터에 전달되는 라텍스 코드입니다. 라텍스가 코드 블록을 구문 분석할 때 루아가 코드가 무엇인지 이해하지 못하는 코드를 엉망으로 만들 수 있습니다. 예:
\directlua{print('\\')}
\
라텍스가 그것을 보고 거기에 새 줄을 만들려고 시도한 다음 새 코드가 루아 파서에 전달되기 때문에 a를 인쇄하지 않습니다 \\
. 이는 결국 루아 코드로 이해되지 않습니다.
답변2
이 방법으로 시도해 보세요:
\begin{tabular}{lllllllll}
\luacode
num=6
for i=1,num do
for j=1,num do
ixj='$'..i..'\\times'..j..'='..i*j..'$';
tex.print(ixj)
if(j<num) then tex.sprint('&') else tex.sprint('\\\\') end
end
end
\endluacode
\end{tabular}
아니면 대안으로
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode}
tex.print("\\begin{tabular}{lllllllll}")
num=6
for i=1,num do
for j=1,num do
ixj='$'..i..'\\times'..j..'='..i*j..'$';
tex.print(ixj)
if(j<num) then tex.sprint('&') else tex.sprint('\\\\') end
end
end
tex.print("\\end{tabular}")
\end{luacode}
\end{document}