2010-01-22 3 views
4

Я пишу пакет LaTeX, который должен использовать \write18. Некоторые из команд оболочки, которые я выпускаю, являются системными (например, rm против del). Есть ли способ определить, в какой системе я запущен?LaTeX: На какой ОС я работаю?

Этого было бы достаточно, чтобы устранить неоднозначность между Windows и другими (Unix-подобными) системами.

ответ

3

Посмотрите на пакет платформы LaTeX ifplatform. Было много дискуссий о надежных методах на разных платформах, и текущий выпуск работает очень хорошо.

+0

Ницца. Он использует '\ IfFileExists' с'/dev/null' для Unix-систем и 'nul:' для Windows. И целая куча дурацких резервов, если это пойдет не так. +1 –

+1

[ссылка на пакет] (https://www.ctan.org/tex-archive/macros/latex/contrib/ifplatform?lang=en) –

1

Не очень хорошо, но это работает для меня

\newread\checkf 
\immediate\openin\checkf = C:/WINDOWS/win.ini 
\ifeof\checkf not windows \else windows\fi 
\closein\checkf 
1

Если вы можете пометить вашу ОС с файлом вы можете сделать

\IfFileExists{/etc/motd}{unix code here}{windows code here} 

Там нет ничего особенного пути /etc/motd; его скорее всего можно найти в системе Unix и вряд ли в системе Windows. Если вы хотите быть уверенным в некорректности, вы должны создать файл, специально предназначенный для обозначения системы, каким бы способом вы ее не идентифицировали.

+0

Идея похожа на Алексея, и это очень хорошо. Но у меня нет контроля над системой, и да, я предпочел бы быть уверенным, поскольку это будет в пакете, который будет публично распространен. ;-) –

0

У меня была следующая идея, которую я сейчас использую. Я тестировал его только в Windows XP и OS X, где он работает нормально. По общему признанию, немного надуманный, но в принципе он должен работать нормально почти в другом месте.

\newif\ifwindows 

\immediate\write18{echo $SHELL > \jobname.os} 
\newread\@whichos 
\immediate\openin\@whichos\jobname.os 
\read\@whichos to \@whichosshell 
\ifthenelse{\equal{\@whichosshell}{$SHELL }} 
{\windowstrue} 
{\windowsfalse} 
\closein\@whichos 

\ifwindows 
    \typeout{System detected: Windows} 
    \newcommand\DeleteFile[1]{\immediate\write18{del #1}} 
\else 
    \typeout{System detected: Unix-like} 
    \newcommand\DeleteFile[1]{\immediate\write18{rm #1}} 
\fi 
% Cleanup. 
\DeleteFile{\jobname.os} 

Ключевым моментом здесь является то, что Windows, не будет расширять переменную окружения $SHELL (любой другой переменной, сделал бы, на самом деле), поэтому он будет писать строку $SHELL к файлу буквально.

Смежные вопросы