如何在 M2 Ventura Mac 上启用 LuaLaTeX arara 对话框

如何在 M2 Ventura Mac 上启用 LuaLaTeX arara 对话框

实现 arara 对话框

我已经采取了许多步骤在 M2 Mac 上实现 LaTeX arara 对话框,如 arara-manual.pdf 等第 80-85 页所述,但仍然缺少一些东西。

迄今采取的措施包括:

  1. 为了使 Java Swing 工具包可用,我安装了(并通过终端命令确认java version)Java 版本 1.8.0_371,实际上已经安装。

  2. 在终端中,我设置了适当的环境变量以确保 Java 运行时可访问:

export JAVA_HOME =$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH
  1. 我确认 Swing 工具包可以通过一个简单的 Java Swing 程序使用并且正常运行SwingTest.java
import javax.swing.*;

public class SwingTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Swing Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 200);
            frame.setVisible(true);
        });
    }
}

我在终端中运行如下命令:

javac SwingTest.java然后 java SwingTest

测试结果显示屏幕上出现了一个标题为“摆动测试”的小窗口,确认所有设置均正确。

  1. 在我的 HOME 目录 (cd ~) 中,我创建了隐藏文件夹.arara(mkdir .arara),在其中创建了作为模板的 arara YAML 配置文件araraconfig.yaml

YAML 配置文件包含一个自定义 arara 规则,该规则mydialog使用必要的逻辑来调用以显示所需的 arara 对话框,例如:

!config
# Arara rule: mydialog
# Description: Example rule with a Dialog box
# Author: Your Name

# Declare the rule
identifier: mydialog
name: My Dialog Rule
command: >
  @{
    // Import the necessary Java classes
    import javax.swing.JOptionPane;

    // Display the Dialog box and capture the user's response
    int option = JOptionPane.showConfirmDialog(null, "Are you sure you want to proceed?", "Confirmation", JOptionPane.YES_NO_OPTION);

    // Process the user's response
    if (option == JOptionPane.YES_OPTION) {
      // Execute the necessary commands or actions here
      // For example, you can run a specific command using `runCommand`:
      // runCommand("pdflatex", "-interaction=nonstopmode", "%O", "--shell-escape", "%S");
      // Or execute a custom script:
      // run("myscript.sh");
    } else {
      // User chose not to proceed, so you can perform alternative actions if needed
      // For example, you can terminate the compilation process with an error message:
      // throwError("User cancelled the operation.");
    }
  }
  1. 上述 YAML 指令已在在线 YAML 验证器上确认https://www.anyjson.in/yaml-validator为有效。

  2. 我将该文件的副本放在araraconfig.yaml与我的 LuaLateX 项目文件(带有 .tex 扩展名)相同的目录中。

  3. 在我的 LuaLateX 项目文件(带有 .tex 扩展名)的最上面一行,我包含了 arara 指令:% arara: mydialog在执行 LuaLateX 项目文件中的其余指令之前立即触发 arara 对话框出现。

  4. 我创建了一个四行 MWE LuaLateX 项目文件,其唯一目的是测试上述 arara 配置,以演示 arara 对话框应如何显示:

% arara: mydialog
\documentclass{book}
\begin{document}
\end{document}

araraconfig.yaml排版时,我希望在执行后续三行 LuaLaTeX 代码之前,立即出现一个 arara 对话框,询问“您确定要继续吗?”(如我的配置文件中所述)。

不幸的是,上述安排存在两个问题。

首先,当我使用 TeXShop 排版上述 LuaLateX MWE 项目文件(扩展名为 .tex)时,出现了备受追捧的 arara 对话框从未出现,表示有些事情不对劲。

其次,为了检查 arara 包本身是否正确安装,运行arara -v(在终端中)会导致以下错误:

Usage: arara [OPTIONS] file...

Error: Missing argument "file"

我能做些什么来纠正错误,或者靠近点以确定哪里出了问题,将不胜感激。

感谢阅读,Star Blooming


更新:回答 David Carlisle 发表的第一条评论,如果我arara youfile.tex在终端中运行(例如 myprojectfile.tex),则会出现以下响应:

  __ _ _ __ __ _ _ __ __ _
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

  ERROR

I could not parse the configuration file, something bad happened.
This part is quite tricky, since it involves aspects of the
underlying data serialization format. I will do my best to help
you in any way I can. There are more details available on this
exception:

DETAILS ---------------------------------------------------------
com.charleskorn.kaml.UnknownPropertyException at identifier on
line 7, column 1: Unknown property 'identifier'. Known properties
are: dbname, defaultPreamble, filetypes, header, laf, language,
logging, logname, loops, paths, preambles,
prependPreambleIfDirectivesGiven, verbose

Total: 0.53 seconds

乍一看,上述详细信息可能指向我的araraconfig.yaml文件中的第 7 行,例如:

identifier: mydialog

尽管我已经araraconfig.yaml在在线 YAML 验证器上验证了 YAML 文件https://www.anyjson.in/yaml-validator,配置文件可能确实有问题。

如果是这样的话,那么 arara 指令(% arara: mydialog)至少可以识别araraconfig.yamlYAML 配置文件的存在。

作为 YAML 的完全新手,特别是对于 Java 和 arara 对话框之间的接口,我对 YAML 错误一无所知,也不知道需要做什么才能通过 Java 正确访问 arara 对话框。

我在 arara-manual.pdf 中没有看到任何可以提供线索来纠正错误的内容。

如果您对我如何纠正该错误提出任何建议,我将不胜感激。


更新 2:在我开始之前,我要对@TeXnician 表示十万分的感谢。你提供的是非凡的!。(我希望您在阅读本文之前已经睡着了!)

我花了一段时间(早期痴呆症?)来分析你的答案。我们正在取得进展。如果你不介意的话,在我接受你的答案之前,我想解决一个我希望是剩余的错误。

如果这是多余的,请原谅,但在结合您的回答和建议后,我想为自己和其他可能遵循并希望使用 arara 对话框的人详细说明这些步骤。

需要更正的是...用于检查 arara 是否正确安装的终端命令是arara --version,而不是我之前所说的。我在终端中arara -v运行时收到的响应是:arara --version

% arara --version
  __ _ _ __ __ _ _ __ __ _
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

arara 7.1.0
Copyright (c) 2023, Island of TeX
arara is released under the New BSD license.

New features in version 7.1.0:
* Add (Lua) project support to arara.
* Use a defined domain-specific file system API instead of `java.io.File`.
* Use header mode by default (`-w` restores the old behavior).

See the full changelog of this release at
https://gitlab.com/islandoftex/arara/-/blob/development/CHANGELOG.md

看来 arara 已经正确安装。

前 3 个步骤与之前相同;其余步骤遵循@TeXnician 的回答和建议。

  1. 为了使 Java Swing 工具包可用,我安装了(并通过终端命令确认java version)Java 版本 1.8.0_371,实际上已经安装。

  2. 在终端中,我设置了适当的环境变量以确保 Java 运行时可访问:

export JAVA_HOME =$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH
  1. 我通过一个简单的 Java Swing 程序 SwingTest.java 确认了 Swing 工具包可用并且正常运行:
import javax.swing.*;

public class SwingTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Swing Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 200);
            frame.setVisible(true);
        });
    }
}

我在终端中运行如下命令:

javac SwingTest.java然后java SwingTest

测试结果显示屏幕上出现了一个标题为“摆动测试”的小窗口,确认所有设置均正确。

  1. 我创建了以下内容 配置文件:./.araraconfig.yaml并将文件放在<project>我的 lualatex.tex文件所在的目录中:
!config
paths:
- 'rules/'

这告诉 arara 寻找自定义规则在我的<project>/rules/子目录中。

  1. <project>/rules/子目录中,我放置了mydialog.yaml 规则包含以下 YAML 指令的文件:
!config
# Arara rule: mydialog
# Declare the rule
identifier: mydialog
name: My Dialog Rule
authors:
- Star Blooming
commands:
- name: Show confirmation dialog
  command: >
  @{
    // Import the necessary Java classes
    import javax.swing.JOptionPane;

    // Display the Dialog box and capture the user's response
    int option = JOptionPane.showConfirmDialog(null, "Are you sure you want to proceed?", "Confirmation", JOptionPane.YES_NO_OPTION);

    // Process the user's response
    if (option == JOptionPane.YES_OPTION) {
      // Execute the necessary commands or actions here
      // For example, you can run a specific command using `runCommand`:
      // runCommand("pdflatex", "-interaction=nonstopmode", "%O", "--shell-escape", "%S");
      // Or execute a custom script:
      // run("myscript.sh");
    } else {
      // User chose not to proceed, so you can perform alternative actions if needed
      // For example, you can terminate the compilation process with an error message:
      // throwError("User cancelled the operation.");
    }

    return true;
  }

笔记command:上述指令反映了需要包含在部分中的事实commands。)

  1. 通过上面详细的设置,我的项目结构如下所示:
. (<--the <project directory>)
|- rules/  (<--the <project>/rules/ subdirectory)
|  |- mydialog.yaml  (<--arara RULES file in <project>/rules/ subdirectory)
|- .araraconfig.yaml  (<--arara CONFIGURATION file in <project directory>)
|- <lualatex project>.tex  (<--my lualatex `.tex` file in <project directory>)
  1. 四行 MWE LuaLateX 项目文件araratesting.tex(唯一目的是测试上述 arara 配置并演示 arara 对话框应如何出现)与以前保持相同:
% arara: mydialog
\documentclass{book}
\begin{document}
\end{document}
  1. 现在,在 配置文件和规则文件,我在终端中运行了以下代码:
% arara araratesting.tex

结果如下:

  __ _ _ __ __ _ _ __ __ _
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Processing "araratesting.tex" (size: 70 B, last modified:
2023-06-04 05:52:42), please wait.

  ERROR

I have spotted an error in rule "mydialog" located at
"/<project directory>/rules/mydialog.yaml".
I could not parse the rule, something bad happened. This part is
quite tricky, since it involves aspects of the underlying data
serialization format. I will do my best to help you in any way I
can. There are more details available on this exception:

DETAILS ---------------------------------------------------------
java.util.NoSuchElementException: No value present

Total: 0.55 seconds

我猜测上述错误是由于mydialog.yaml 规则文件(但这只是猜测)。

araratesting.log如果需要的话,我当然也可以提供文件。

再次感谢您的阅读,以及您的所有帮助建议。该睡觉了。


更新 3:根据@TeXnician另一篇文章中关于使用该标志运行 arara 的建议,在终端中执行以下命令后的结果-l如下:arara.log

arara -l araratesting.tex

05 Jun 2023 11:51:24.883 INFO  - 
Welcome to arara 7.1.0!
-----------------------------------------------------------------
05 Jun 2023 11:51:24.885 DEBUG - 
::: arara @ /usr/local/texlive/2023/texmf-dist/scripts/arara
::: Java 20.0.1, Oracle Corporation
::: /Library/Java/JavaVirtualMachines/jdk-20.jdk/Contents/Home
::: Mac OS X, aarch64, 13.4
::: user.home @ /Users/<USER_ROOT>
::: CF @ /Users/<USER_ROOT>/Scrivener/Differ2Latex/Differ2Latex-v29b1/.araraconfig.yaml
-----------------------------------------------------------------
05 Jun 2023 11:51:24.888 INFO  - Processing "araratesting.tex" (size: 70 B, last modified: 2023-06-04 05:52:42), please wait.
05 Jun 2023 11:51:24.889 INFO  - I found a potential pattern in line 1: mydialog
05 Jun 2023 11:51:24.890 INFO  - All directives were validated. We are good to go.
-------------------------- DIRECTIVES ---------------------------
Directive(identifier='mydialog', parameters={reference=/Users/<USER_ROOT>/Scrivener/Differ2Latex/Differ2Latex-v29b1/araratesting.tex},conditional={ NONE }, lineNumbers=[1])
-----------------------------------------------------------------
05 Jun 2023 11:51:24.891 INFO  - I am ready to interpret rule "mydialog".
05 Jun 2023 11:51:24.892 INFO  - Rule location: "/Users/<USER_ROOT>/Scrivener/Differ2Latex/Differ2Latex-v29b1/rules"
05 Jun 2023 11:51:24.894 ERROR - I have spotted an error in rule "mydialog" located at "/Users/<USER_ROOT>/Scrivener/Differ2Latex/Differ2Latex-v29b1/rules/mydialog.yaml". I could not parse the rule, something bad happened. This part is quite tricky, since it involves aspects of the underlying data serialization format. I will do my best to help you in any way I can. There are more details available on this exception:
05 Jun 2023 11:51:24.894 ERROR - java.util.NoSuchElementException: No value present
05 Jun 2023 11:51:24.895 INFO  - Total: 0.102 seconds

从上面的arara.log文件中,现在可以清楚地看出错误出在mydialog.yaml文件内。


答案1

首先,感谢您提出非常详尽的问题。这样您就可以轻松找到走错路的地方。步骤 1 到 4 没问题,让我们看看剩下的步骤。

步骤 4:在我的 HOME 目录 (cd ~) 中,我创建了隐藏文件夹 .arara (mkdir .arara),在其中创建了作为模板的 arara YAML 配置文件 araraconfig.yaml。

多个账户的这一说法都是误导性的:

  1. 您提供的实际上并不是配置文件(请参阅手册中的“配置文件”一章,了解什么是配置文件)。您在此处显示的 YAML 代码是一条规则。我将在下面解释它们如何交互。
  2. ~/.arara/araraconfig.yaml不是可识别的位置。就 shell 表达式而言,arara 会~/{.araraconfig.yaml,araraconfig.yaml,.arararc.yaml,arararc.yaml}按此顺序查找全局配置文件。或者,如果您在本地执行此操作(例如,在您的项目中),则./{.araraconfig.yaml,araraconfig.yaml,.arararc.yaml,arararc.yaml}。但您似乎已经认识到这一点,因为您将其作为模板位置提及,并将其复制到某个地方。

第 5 步都很好,但无关紧要,所以我将忽略它。

第 6 步:我将 araraconfig.yaml 文件的副本放在与我的 LuaLateX 项目文件(带有 .tex 扩展名)相同的目录中。

这时,您就会遇到混淆规则和配置文件的问题。因为该位置 (./araraconfig.yaml ),你已经告诉 arara,你在那里显示的文件是一个配置文件,它指示 arara如何执行运行。例如,是否应该记录其输出,是否应该打印详细输出等。

有效的配置文件应该是这样的:

!config
verbose: true

请注意,您提供的错误消息也暗示了这一点:

I could not parse the configuration file, something bad happened.
This part is quite tricky, since it involves aspects of the
underlying data serialization format. I will do my best to help
you in any way I can. There are more details available on this
exception:

DETAILS ---------------------------------------------------------
com.charleskorn.kaml.UnknownPropertyException at identifier on
line 7, column 1: Unknown property 'identifier'. Known properties
are: dbname, defaultPreamble, filetypes, header, laf, language,
logging, logname, loops, paths, preambles,
prependPreambleIfDirectivesGiven, verbose

请参阅,错误消息列出了您实际上可以在配置文件中提供的选项。 在您的例子中,您想要提供自定义规则,因此让我们尝试以下操作./araraconfig.yaml

!config
paths:
- 'rules/'

它告诉 arara 在名为 rules 的目录中查找自定义规则。稍后我会提到它。

步骤 7:在我的 LuaLateX 项目文件(带有 .tex 扩展名)的最上面一行,我包含了 arara 指令:% arara: mydialog在执行 LuaLateX 项目文件中的其余指令之前立即触发 arara 对话框出现。

指示 % arara: mydialog将导致 arara 在其规则路径中查找命名的规则mydialog。如果没有配置文件,arara 将只查看 TeX 发行版的默认规则。它不会mydialog在那里找到规则。

这就是配置文件发挥作用的地方。上面的配置文件告诉 arararules/也查看目录。所以现在它会检查rules/mydialog.yaml你的项目目录中是否有文件。

这是您要放置规则内容的地方:

!config
# Arara rule: mydialog
# Description: Example rule with a Dialog box
# Author: Your Name

# Declare the rule
identifier: mydialog
name: My Dialog Rule
command: >
  @{
    // Import the necessary Java classes
    import javax.swing.JOptionPane;

    // Display the Dialog box and capture the user's response
    int option = JOptionPane.showConfirmDialog(null, "Are you sure you want to proceed?", "Confirmation", JOptionPane.YES_NO_OPTION);

    // Process the user's response
    if (option == JOptionPane.YES_OPTION) {
      // Execute the necessary commands or actions here
      // For example, you can run a specific command using `runCommand`:
      // runCommand("pdflatex", "-interaction=nonstopmode", "%O", "--shell-escape", "%S");
      // Or execute a custom script:
      // run("myscript.sh");
    } else {
      // User chose not to proceed, so you can perform alternative actions if needed
      // For example, you can terminate the compilation process with an error message:
      // throwError("User cancelled the operation.");
    }
  }

但是等等,这看起来像一条规则,对人类来说,这显然是一条规则。但它不符合 arara 要求的规则语法。如果您像这样运行它,您将收到一条错误消息,因为您使用了commandoutside (文档对需要包含在部分中的commands部分非常清楚)。所以让我们修复该部分(实际上,它仍未经测试,但绝对比 OP 更正确):commandcommands

!config
# Arara rule: mydialog
# Declare the rule
identifier: mydialog
name: My Dialog Rule
authors:
- Star Blooming
commands:
- name: Show confirmation dialog
  command: >
  @{
    // Import the necessary Java classes
    import javax.swing.JOptionPane;

    // Display the Dialog box and capture the user's response
    int option = JOptionPane.showConfirmDialog(null, "Are you sure you want to proceed?", "Confirmation", JOptionPane.YES_NO_OPTION);

    // Process the user's response
    if (option == JOptionPane.YES_OPTION) {
      // Execute the necessary commands or actions here
      // For example, you can run a specific command using `runCommand`:
      // runCommand("pdflatex", "-interaction=nonstopmode", "%O", "--shell-escape", "%S");
      // Or execute a custom script:
      // run("myscript.sh");
    } else {
      // User chose not to proceed, so you can perform alternative actions if needed
      // For example, you can terminate the compilation process with an error message:
      // throwError("User cancelled the operation.");
    }

    return true;
  }

在上面的规则中,您仍然需要进行一些调整。例如(如 OP 中所示),您要执行的所有实际任务都被注释掉了。而且runCommandarara 中没有。相反,您希望返回它应该运行的所有命令(return true上面的 中您应该说类似 的内容return [getCommand(…)];您可以以任何方式构建要返回的列表,例如使用条件)。

注意:您的示例中实际上没有使用任何 arara 对话框,而是使用普通的 Swing。arara 处理是/否对话框的方式是showOptions(250, 4, 'Important!', 'Do you like ice cream?', 'Yes!', 'No!') == 1(文档示例检查您是否喜欢冰淇淋)。不过,我记不清它在规则中的效果如何(我记得的所有示例都在指令中使用这些对话框)。

步骤 8:我创建了一个四行 MWE LuaLateX 项目文件,其唯一目的是测试上述 arara 配置,以演示 arara 对话框应如何显示:

MWE 是完美无缺的;)


重申:您混淆了规则和配置文件以及格式(YAML)的语法正确性和元语言(arara 规则)的语法正确性。

通过上面详细的设置,你的项目将如下所示

.
|- rules/
|  |- mydialog.yaml
|- .araraconfig.yaml
|- myfile.tex

在配置文件和规则文件中添加相应的内容。

请注意,您仍然必须修复该规则才能实际返回有用的命令并做一些有用的事情。

相关内容