НейроАгент

Исправление: запуск mintty Cygwin через shell escape pdflatex не работает

Узнайте, почему shell escape pdflatex открывает командную строку Windows вместо терминала Cygwin и как это исправить. Найдите решения для правильного запуска mintty из документов LaTeX с включенным shell escape.

Почему запуск Cygwin (mintty.exe) из Windows pdflatex через shell escape открывает командную строку Windows вместо терминала Cygwin?

У меня установлены Cygwin64 и Windows TeXlive на моем компьютере. Когда я компилирую следующий документ LaTeX с неограниченным shell escape:

\documentclass

\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-~}
\ExplSyntaxOff
\end

Вместо запуска терминала Cygwin открывается командная строка Windows. Однако, если я запускаю команду C:/cygwin64/bin/mintty.exe - непосредственно в командной строке, открывается идентичное окно. Но когда я запускаю ту же команду из реальной командной строки, она правильно открывает терминал Cygwin, как и ожидалось.

Почему происходит такое поведение, и как я могу убедиться, что pdflatex запускает терминал Cygwin напрямую?

НейроАгент

При использовании pdflatex с shell escape для запуска mintty.exe из Cygwin открывается командная строка Windows вместо терминала Cygwin, поскольку механизм shell escape в pdflatex выполняет команды через стандартный командный процессор Windows (cmd.exe), который не поддерживает правильный контекст выполнения Cygwin. Это приводит к тому, что mintty.exe интерпретируется как запуск cmd.exe, а не как терминал Cygwin.


Содержание


Понимание механизма shell escape

Функция shell escape в LaTeX позволяет документам выполнять внешние команды с помощью команды \write18 или функции \sys_shell_now:n из пакета expl3. При использовании pdflatex с опцией -shell-escape эти команды выполняются через системную оболочку.

В Windows стандартной оболочкой обычно является cmd.exe, что означает, что когда ваш LaTeX-документ вызывает C:/cygwin64/bin/mintty.exe -, командный процессор интерпретирует это иначе, чем при запуске напрямую из среды Cygwin.

Согласно неофициальному руководству по LaTeX2e, команды shell escape подлежат ограничениям безопасности и могут вести себя по-разному в зависимости от способа их вызова.


Почему mintty открывает командную строку вместо терминала Cygwin

Проблема возникает из-за того, как Windows обрабатывает выполнение mintty.exe через cmd.exe:

  1. Перехват командного процессора: Когда pdflatex выполняет команду shell escape, она проходит через cmd.exe Windows, который может интерпретировать mintty.exe как команду для запуска новой командной строки Windows, а не как эмулятор терминала Cygwin.

  2. Отсутствие контекста Cygwin: Команда C:/cygwin64/bin/mintty.exe - работает при запуске из оболочки bash Cygwin, потому что среда уже настроена правильно. Однако при выполнении из cmd.exe (что и использует pdflatex), команда не имеет правильного контекста Cygwin.

  3. Проблемы с разрешением путей: Командный процессор Windows может не правильно разрешать пути Cygwin или понимать назначение исполняемого файла mintty.exe без дополнительных параметров.

Как отмечено в обсуждении на Stack Overflow, это распространенная проблема при попытке запуска приложений Cygwin из механизма shell escape LaTeX.


Решения для правильного запуска mintty

Решение 1: Использование параметра -e с mintty

Наиболее надежное решение — использовать параметр -e mintty для указания команды, которую следует выполнить, обеспечивая правильный контекст:

latex
\documentclass{article}

\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-e~/bin/bash~-l~}
\ExplSyntaxOff
\end{document}

Этот подход явно указывает mintty выполнить bash с параметрами оболочки входа в систему, что заставляет его поддерживать среду Cygwin.

Решение 2: Использование cygpath для преобразования путей

При работе с смешанными путями Windows и Cygwin используйте утилиту cygpath для обеспечения правильного разрешения путей:

latex
\documentclass{article}

\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {bash~c~"$(cygpath~-u~'C:/cygwin64/bin/mintty.exe')~-e~/bin/bash~-l~"}
\ExplSyntaxOff
\end{document}

Решение 3: Создание пакетного файла-обертки

Создайте простой пакетный файл, который правильно запускает mintty, и вызывайте его из LaTeX:

Создайте launch_mintty.bat:

batch
@echo off
C:\cygwin64\bin\mintty.exe -e /bin/bash --login -i

Затем вызовите его из LaTeX:

latex
\documentclass{article}

\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {launch_mintty.bat}
\ExplSyntaxOff
\end{document}

Альтернативные подходы

Использование оболочки bash Cygwin по умолчанию

Вместо того чтобы пытаться запустить mintty напрямую, рассмотрите возможность использования оболочки bash Cygwin через shell escape:

latex
\documentclass{article}

\begin{document}
\ExplSyntaxOn
\sys_shell_now:n {C:/cygwin64/bin/bash~--login~-c~"echo~'Hello~from~Cygwin'"}
\ExplSyntaxOff
\end{document}

Настройка mintty как терминала по умолчанию

Согласно обсуждению на Unix Stack Exchange, вы можете настроить mintty как терминал по умолчанию, изменив файл /etc/passwd Cygwin или создав пакетный файл, который правильно инициализирует среду.

Создайте пакетный файл с:

batch
@echo off
C:\cygwin64\bin\mintty.exe /bin/bash --login -i

Использование различных методов вызова

Из решения на Super User, вы можете использовать различные методы вызова:

latex
\documentclass{article}

\begin{document}
\ExplSyntaxOn
% Простое выполнение
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-e~/bin/bash~-l~-c~'echo~Hello~World'}

% С интерактивной оболочкой после выполнения
\sys_shell_now:n {C:/cygwin64/bin/mintty.exe~-e~/bin/bash~-l~-c~'echo~Hello~World;~bash'}
\ExplSyntaxOff
\end{document}

Проверка и тестирование

После реализации любого из этих решений проверьте, что mintty запускается правильно, выполнив:

  1. Проверка файла журнала LaTeX: Ищите любые сообщения об ошибках или предупреждения, связанные с выполнением команды shell escape.

  2. Тестирование команд по отдельности: Тестируйте каждый компонент команды отдельно, чтобы изолировать проблему.

  3. Использование отладочного вывода: Добавьте отладочную информацию в ваш LaTeX-документ, чтобы увидеть, какая именно команда выполняется.

  4. Проверка переменных окружения: Убедитесь, что необходимые переменные окружения правильно установлены при выполнении команды.

Всегда компилируйте ваш LaTeX-документ с опцией -shell-escape:

bash
pdflatex -shell-escape your_document.tex

Как упоминается на форуме LaTeX.org, для систем MiKTeX в некоторых случаях может потребоваться использовать --enable-write18 вместо -shell-escape.


Источники

  1. Запуск Cygwin (mintty.exe) из Windows pdflatex (через shell escape) фактически запускает командную строку Windows? - Stack Overflow

  2. pdflatex + Cygwin bash: shell escape не работает? - TeX - LaTeX Stack Exchange

  3. Использование mintty как терминала по умолчанию в Cygwin и оболочки по умолчанию как bash - Unix & Linux Stack Exchange

  4. Параметры командной строки (неофициальное руководство по LaTeX2e)

  5. Как включить shell-escape? - TeX - LaTeX Stack Exchange

  6. Cygwin: Запуск скрипта в mintty/bash - Super User

  7. Включить shell escape для epstopdf - LaTeX.org

Заключение

Поведение, с которым вы сталкиваетесь, возникает потому, что механизм shell escape в pdflatex выполняет команды через cmd.exe Windows, который не правильно поддерживает контекст выполнения Cygwin, необходимый для правильной работы mintty. Чтобы решить эту проблему:

  1. Используйте параметр -e с mintty для явного указания команды для выполнения
  2. Воспользуйтесь cygpath для правильного преобразования путей между форматами Windows и Cygwin
  3. Рассмотрите возможность создания пакетного файла-обертки, который правильно инициализирует среду Cygwin
  4. Протестируйте различные методы вызова, чтобы найти тот, который лучше всего подходит для вашей настройки

Наиболее надежным решением обычно является использование C:/cygwin64/bin/mintty.exe -e /bin/bash --login -i в команде shell escape вашего LaTeX, поскольку это явно указывает mintty запустить оболочку bash входа в систему, обеспечивая поддержание правильного контекста Cygwin.